如果我有一个列表[1,2,3,4,5],如何获得连续对并对它们执行操作?例如,我想获得(1,2)并对它们执行doSomething。在下一次迭代中,我想获得(2,3),依此类推。这是我到目前为止:序言列表连续对
listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]).
我可以做第一次迭代,但我比较H2和H3卡住了。
如果我有一个列表[1,2,3,4,5],如何获得连续对并对它们执行操作?例如,我想获得(1,2)并对它们执行doSomething。在下一次迭代中,我想获得(2,3),依此类推。这是我到目前为止:序言列表连续对
listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]).
我可以做第一次迭代,但我比较H2和H3卡住了。
首先,如果你有[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放回去。 (即,你递归的名单将永远是空的。)
,而不是一个明确的“环”,你可以使用这个成语的做法:
forall(append(_,[X,Y|_],List), doSomething(X,Y)).
谢谢!我不能相信那是它。 –