我编写了用于计算零值节点的谓词,但是计数器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).
谁可以帮忙呢?
答案 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
。)