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