在prolog中计算二叉树中的零节点

时间:2015-11-22 21:17:32

标签: tree prolog binary-tree

我编写了用于计算零值节点的谓词,但是计数器Num1工作不正确。

countZeros(empty, Num).
countZeros(tree(0, Left, Right), Num) :- 
    Num1 = Num + 1,
    countZeros(Left, Num1),
    countZeros(Right, Num1).
countZeros(tree(_, Left, Right), Num) :-
    countZeros(Left, Num),
    countZeros(Right, Num).

这是我的疑问:

countZeros(tree(5,
        tree(0,
            tree(6, empty, empty),
            tree(4, empty, empty)
        ),
        tree(0,
            tree(2, empty, empty),
            tree(0, empty, empty)
        )
        )
    , 0).

谁可以帮忙呢?

1 个答案:

答案 0 :(得分:0)

您的计数递归计算是倒退的。您将从未实例化的计数开始,并添加1直到您到达一个空节点而不更改计数。因此,计数永远不会被初始化,也永远不会返回。

如果您在逻辑上考虑谓词条款并描述它们的含义,则有助于正确定义它们。例如,如果当前节点为空,则零的数量为0 。这将表示为:

countZeros(empty, 0).

你也可以说,如果当前节点是0,那么零的数量是左分支中的零个数加上右分支中的零个数加上{ {1}} 的。这可以表示为:

1

类似地,如果当前节点不是countZeros(tree(0, Left, Right), Num) :- countZeros(Left, Num1), countZeros(Right, Num2), Num is Num1 + Num2 + 1. ,则零的数量是左分支中的零的数量加上右分支中的零的数量

0

您需要将这些操作转换为Visual Prolog。 (我不知道“术语不同”的运算符,而我使用上面的countZeros(tree(X, Left, Right), Num) :- dif(X, 0), countZeros(Left, Num1), countZeros(Right, Num2), Num is Num1 + Num2. 。我使用的是dif(X, 0)而不是is/2。)