这是 Learn Prolog Now 中的练习 3.5。他们把它放在解释列表之前,所以我需要一个不涉及列表的程序。

任务是交换嵌套二叉树的叶子。如果查询是

swap(tree(tree(leaf(1), leaf(2)), leaf(4)), T).

答案应该是
T = (tree(leaf(4), tree(leaf(2), leaf(1))).


swap((X, Y), (Y, X)).

swap(tree(X, Y), T) :-
   swap((X, Y), (Y, X)),
   T = (Y, X).

我得到
T = (leaf(4), tree(leaf(1), leaf(2))).

如您所见,leaf(1)leaf(2) 没有交换。我想要一些提示甚至你的程序,它应该适用于任何深度的节点。谢谢。

最佳答案

你有一个基本情况交换一片叶子,一个一般情况交换一棵树!
对于一片叶子,无事可做:

swap(leaf(X), leaf(X)).

当你交换一棵树时,你也必须交换它的叶子,所以
swap(tree(X,Y), tree(Y1,X1)) :-
    swap(X,X1),
    swap(Y,Y1).

关于recursion - 在序言中交换二叉树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20621676/

10-09 05:35