【发布时间】:2018-10-26 06:31:09
【问题描述】:
我需要使用 prolog 计算二叉树的所有内部节点我可以使用以下代码计算所有节点
internal(tree(_,L,R), I) :- internal(L, I2), internal(R, I3), I is I2 + I3 + 1.
internal(nil, 0).
我认为通过将基本情况更改为
internal(tree(_,nil, nil), 0).
我可以让它工作,但它返回 false。
这是一个应该返回 4 internal(tree(8,tree(5,tree(2,nil,nil),tree(7,nil,nil)), tree(9,nil,tree(15) 的测试用例,tree(11,nil,nil),nil))),I).
谁能告诉我我的错误在哪里? 谢谢
阅读您的建议后,我得到了这个,但它仍然失败。
internal(tree(_,L,R), I) :- internal(L, I2), internal(R, I3), I is I2 + I3.
internal(tree(_,nil, R), I):- !, internal(R, I3), I is I3 + 1.
internal(tree(_,L, nil), I):- !, internal(L, I3), I is I3 + 1.
internal(tree(_,nil, nil), 0).
internal(nil, 0).
【问题讨论】:
-
提示:
+1在这里做什么? -
您的呼叫是否使用
l作为结果?l不是一个变量,而是一个常量。所以你应该使用 大写 v 标识符。 -
@WillemVanOnsem 结果调用使用大写 i,而不是 l,据我了解,+1 是在找到基本案例的解决方案后向每个节点添加 1,这将返回 0
-
但是在你的例子中你有一个
tree(_, nil, tree(_, _, _))。如果您删除了internal(nil, 0),这与归纳或基本情况如何匹配? -
但如果你有一个
tree(_, nil, tree(_, _, _)),那么左边的孩子是nil,右边的孩子是tree,所以基本情况不足够,也不是归纳满足,因为它会在孩子中调用internal/2,因此它会调用internal(nil, I1)。
标签: prolog binary-tree