prolog - 交换列表序言中的第二个和最后一个元素

标签 prolog swap element

嗯,在过去的几个小时里,我一直在尝试将给定列表的第二个项目与其倒数第二个项目(倒数第二个)交换。给出列表[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/

相关文章:

prolog - Prolog 中的锁挑战

list - Prolog 通过尾部插入列表中的数字

algorithm - 如何搜索以给定字母开头的单词

jquery - 你如何在 jQuery 中创建一个元素 "flash"

javascript 选择要包含的元素

prolog - SWI-Prolog 如何证明3个列表的和是否相同?

c++ - 返回时交换 STL?

java - 交换数组中的元素

c - 用函数交换变量不会影响调用站点

javascript - 比较和打印 Bootstrap 面板内的元素