【发布时间】:2013-11-25 12:49:10
【问题描述】:
我在我的人工智能实验室学习 Prolog,来自 Learn Prolog Now!。
在第 5 章中,我们将了解累加器。并且作为一个例子,给出了这两个代码sn-ps。 查找列表的长度
没有累加器:
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
带累加器:
accLen([_|T],A,L) :- Anew is A+1, accLen(T,Anew,L).
accLen([],A,A).
我无法理解,这两个 sn-ps 在概念上有何不同?累加器到底有什么不同?有什么好处?
累加器听起来像中间变量。 (如果我错了,请纠正我。)到目前为止我已经在我的程序中使用它们,所以它真的有那么大的概念吗?
【问题讨论】:
-
正如其他人以各种方式指出的那样,使用累加器为您提供了一个使用 尾递归 的解决方案,该解决方案具有优化优势。例如,请参阅此处的讨论:stackoverflow.com/questions/14096656/…。
-
@false 当我引用文献时,我顺其自然。就个人而言,我也会在规则之前写事实......
标签: recursion prolog tail-recursion accumulator