如果我有一个列表[1,2,3,4,5],我如何获得连续的对并对它们执行操作?例如,我想得到(1,2)并对它们执行doSomething。在下一次迭代中,我想获得(2,3),依此类推。这就是我到目前为止所做的:
listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]).
我可以进行第一次迭代,但在比较H2和H3时我会陷入困境。
答案 0 :(得分:2)
首先,如果您有[1,2,3,4,5]
,则[H1,H2|T]
设置H1 = 1
,H2 = 2
,T = [3,4,5]
。 H1和H2是您想要处理的两个数字。 [H2|T] = [2,3,4,5]
生成您可以继续计算的列表。 (毕竟它从2,3开始,所以递归它会给你下两个你想要的数字。)
所以你的递归案例应该是:
listpairs([H1,H2|T]) :- doSomething(H1,H2), listpairs([H2|T]).
即:将H1和H2取出,用它们做一些事情,然后把H2放回去并递归。
其次,你需要一个基础案例,只剩下一个元素:
listpairs([H]).
如果省略这一点,如果列表包含例如,您将永远不会达到基本情况5个元素,因为我们总是放1个。 (即,你递归的名单永远不会是空的。)
答案 1 :(得分:0)
而不是明确的“循环”,您可以使用这种惯用法:
forall(append(_,[X,Y|_],List), doSomething(X,Y)).