嗯,在过去的几个小时里,我一直在尝试将给定列表的第二个项目与其倒数第二个项目(倒数第二个)交换。给出列表[a,b,c,d,e,f]
,我想得到[a,e,c,d,b,f]
。例如:
correct(List1,X,List2)
?-correct([a,y,b,c,d,e,x,f],x,List2).
List2[a,x,b,c,d,e,y,f].
List1
是我要交换第二个和倒数第二个(倒数第二个)元素的列表。X
是倒数第二个元素。List2
是包含交换元素的新列表。
最佳答案
mbratch 和 CapelliC 发布的解决方案在以下基本情况下均失败:
?- correct([a,y], X, List2).
false.
以下解决方案处理此基本情况,并且不依赖于可能可用或可能不可用的列表谓词。它只遍历一次列表,比其他两种解决方案效率更高:
correct([PreLast, Second], Second, [Second, PreLast]) :-
!.
correct([First, Second, Last], Second, [First, Second, Last]) :-
!.
correct([First, Second| InRest], PreLast, [First, PreLast| OutRest]) :-
correct_aux(InRest, Second, PreLast, OutRest).
correct_aux([PreLast, Last], Second, PreLast, [Second, Last]) :-
!.
correct_aux([Other| InRest], Second, PreLast, [Other| OutRest]) :-
correct_aux(InRest, Second, PreLast, OutRest).
示例查询:
?- correct([a,b], X, List).
X = b,
List = [b, a].
?- correct([a,b,c], X, List).
X = b,
List = [a, b, c].
?- correct([a,b,c,d], X, List).
X = c,
List = [a, c, b, d].
?- correct([a,b,c,d,e], X, List).
X = d,
List = [a, d, c, b, e].
关于prolog - 交换列表序言中的第二个和最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18598030/