【问题标题】:Prolog Tail call optimization for flattening a tree用于展平树的 Prolog 尾调用优化
【发布时间】:2016-11-28 17:19:32
【问题描述】:

我想使用尾递归在序言中展平一棵树。我已经使用带有递归调用的附加列表来完成它。我想优化我的版本。这是我使用递归调用的函数。我想让它优化尾调用。

fl_t(lf(A),[A]).
fl_t(tr(A,B,C),S4):- fl_t(A,X1),fl_t(C,X2),append(X2,[Y],X3),append(X3,X1,S4).

Input : fl_t(lf(a),Result)
Output : Result=[a]

Input : fl_t(tr(lf([1, 2]), 3, leaf([4, 5])),Result)
Output : Result = [[1,2],3,[4,5]]

谁能帮帮我。我是prolog的新手。 TIA

【问题讨论】:

  • 缺少B = Y - 至少

标签: prolog tail-recursion tail-call-optimization


【解决方案1】:

你实际上并没有变平。这样做:

fl_t(T, Xs) :-
   phrase(fl(T), Xs).

fl(lf(A)) --> [A].
fl(tr(A, B, C)) -->
   fl(A),
   [B],
   fl(C).

这是尽可能尾递归的。

【讨论】:

  • 我怎样才能通过使用累加器而不是短语功能来做到这一点。谢谢你:)
  • @billwilliams:说listing(fl) 来获取扩展包。
  • 但是...像上面这样的 DCG 几乎存在于任何 Prolog 中!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2011-05-27
相关资源
最近更新 更多