【问题标题】:How to implement tail recursion for tree algorithms in prolog如何在prolog中实现树算法的尾递归
【发布时间】:2010-12-04 00:18:31
【问题描述】:

如何将以下内容转换为尾递归版本。

sum(void,0).
sum(t(V,L,R),S) :- 
  sum(L,S1),
  sum(R,S2),
  S is V + S1 + S2.

似乎不可能维护单个累加器,因为分支的数量级为 2^n。

一个可能的解决方案是让累加器在每次迭代时将一个新的累加器添加到列表中。 也许上面的解决方案是最优的?

提前致谢。

【问题讨论】:

    标签: tree prolog binary-tree tail-recursion


    【解决方案1】:

    是的,您的解决方案是最优的,因为它会为树中的每个节点只调用一次 sum/2 谓词(而且您根本无法进行更少的调用)。不,您可以通过使用累加器自己实现堆栈来使其成为尾递归。

    这是一个示例(未经测试)。展平谓词可以与 sum 集成,但为了清楚起见,它们在这里是不同的(两者都是尾递归的):

    flatten([],           Acc, Acc).
    flatten([void|ToGo],  Acc, Result) :-
        flatten(ToGo, Acc, Result).
    flatten([t(V,L,R)|ToGo], Acc, Result) :-
        flatten([L,R|ToGo], [t(V,L,R)|Acc], Result).
    
    flatten(Root, Result) :-
        flatten([Root], [], Result).
    
    sum([], Result, Result).
    sum([t(V,_,_)|ToGo], Acc, Result) :-
        NewAcc is Acc+V,
        sum(ToGo, NewAcc, Result).
    
    sum(Tree, Result) :-
        flatten(Tree, FlatTree),
        sum(FlatTree, 0, Result).
    

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2019-11-05
      相关资源
      最近更新 更多