嘿,我对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是迭代的(根据我)......我可能错了。这里“我”用于迭代控制。
如果我错了,请纠正我。
答案 0 :(得分:2)
严格来说,Prolog 不会允许迭代,因为变量是“一次写入”(有点......)。
这两个谓词都是递归的,对我来说似乎是正确的。
它们之间的区别在于add_i是尾递归(递归调用显示为最后一个),因此编译器可以优化它(参见最后一次调用优化,或Tail Call),用跳转替换递归调用,从而避免add_r所需的线性堆栈空间。
答案 1 :(得分:2)
如果您使用Abelson& amp; Sussman(计算机程序的结构和解释)你是完全正确的。
在这种情况下,“迭代”意味着过程的状态仅由几个变量完全描述,“递归”意味着变量的数量随着每次调用而增长。此外,“递归”过程有两个阶段:增长和减少,当它增长时,它会留下“选择点”等(所有差异都在SICP中描述)。
在Prolog中,关于第二个例子,术语“尾递归”的使用频率高于“迭代”。