2016-03-30 53 views
2

如果我有一个列表[1,2,3,4,5],如何获得连续对并对它们执行操作?例如,我想获得(1,2)并对它们执行doSomething。在下一次迭代中,我想获得(2,3),依此类推。这是我到目前为止:序言列表连续对

listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]). 

我可以做第一次迭代,但我比较H2和H3卡住了。

回答

2

首先,如果你有[1,2,3,4,5],然后[H1,H2|T]H1 = 1H2 = 2T = [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放回去。 (即,你递归的名单将永远是空的。)

+0

谢谢!我不能相信那是它。 –

0

,而不是一个明确的“环”,你可以使用这个成语的做法:

forall(append(_,[X,Y|_],List), doSomething(X,Y)).