用于展平树的 Prolog Tail 调用优化

标签 prolog tail-recursion tail-call-optimization

我想使用尾递归在序言中展平一棵树。我已经通过递归调用的附加列表完成了它。我想优化我的版本。这是我使用递归调用的函数。我想对其尾部调用进行优化。

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]]

任何人都可以帮助我吗?我是序言新手。 TIA

最佳答案

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

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

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

这就是尽可能的尾递归。

关于用于展平树的 Prolog Tail 调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40850001/

相关文章:

function - Clojure 中的自动 TCO

Prolog 输出 : list element, 未定位

parsing - 解析器 DCG 不具有确定性是否合适?

c - C中双阶乘方程的尾递归

scala - 限制 Scala 中的递归深度

.net - 生成 .tail IL 指令的简单 F# 代码是什么?

scala - 是否可以使用延续使foldRight尾递归?

return - 如何跳出 Lisp 中的函数?

prolog - 如何在 prolog 语句中表示一个句子

tree - 在序言中声明树的好方法?