prolog中列表总和的迭代程序

时间:2013-09-25 05:30:06

标签: list recursion prolog iteration

嘿,我对prolog递归和迭代有点困惑。我分别在递归和迭代中给出列表总和的代码,并想知道它们是否正确...

add_r([],0).   
add_r([H|T],X) :- add_r(T,X1),X is H + X1.

add_i(List,Sum) :- add_i(List,0,Sum).   
add_i([H|T],I,Sum) :- I1 is I + H , add_i(T,I1,Sum).   
add_i([], I1, I1).

这里add_r是递归程序而add_i是迭代的(根据我)......我可能错了。这里“我”用于迭代控制。
如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:2)

严格来说,Prolog 不会允许迭代,因为变量是“一次写入”(有点......)。

这两个谓词都是递归的,对我来说似乎是正确的。

它们之间的区别在于add_i是尾递归(递归调用显示为最后一个),因此编译器可以优化它(参见最后一次调用优化,或Tail Call),用跳转替换递归调用,从而避免add_r所需的线性堆栈空间。

答案 1 :(得分:2)

如果您使用Abelson& amp; Sussman(计算机程序的结构和解释)你是完全正确的。

在这种情况下,“迭代”意味着过程的状态仅由几个变量完全描述,“递归”意味着变量的数量随着每次调用而增长。此外,“递归”过程有两个阶段:增长和减少,当它增长时,它会留下“选择点”等(所有差异都在SICP中描述)。

在Prolog中,关于第二个例子,术语“尾递归”的使用频率高于“迭代”。