【问题标题】:Iterative program for sum of list in prologprolog中列表总和的迭代程序
【发布时间】:2013-09-30 13:46:06
【问题描述】:

嘿,我对 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 是迭代的(根据我的说法)...我可能错了。这里的“I”用于迭代控制。
如果我错了,请纠正我。

【问题讨论】:

    标签: list recursion prolog iteration


    【解决方案1】:

    如果您使用 Abelson & Sussman(计算机程序的结构和解释)的术语,那么您是完全正确的。

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

    在 Prolog 中,在您的第二个示例中,术语“尾递归”比“迭代”更常用。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2013-03-04
        相关资源
        最近更新 更多