【发布时间】:2021-06-27 09:56:47
【问题描述】:
我是 Prolog 的新手。我正在尝试编写一个谓词,它返回树中给定深度的 二叉树 的节点数。例如下面的树
有 1 个深度为 0 的节点(根节点)、2 个深度为 1 的节点、3 个深度为 2 的节点和 3 个深度为 3 的节点。
在我的程序中,二叉树表示为[value, left-child, right-child] 形式的列表,其中左右子节点本身可以以相同的方式表示。例如,这里是上述树的表示:
[8, [3, [1, [], []],
[6, [4, [], []],
[7, [], []]]],
[10, [],
[14,
[13, [], []],
[]]]]
以下是我目前的想法:
nbNodes([_,_,_],1,0).
nbNodes([_,LC,RC],N2,D2) :-
nbNodes(LC,NL,D), nbNodes(RC,NR,D), N2 is NL+NR, D2 is D+1.
基于我对 Prolog 的有限理解,这意味着:
- 每棵树只有一个深度为 0 的节点。
- 一棵树中深度为 D2 的节点数是三者的左右子节点中深度为 D2-1 的节点数之和。
这两个假设似乎都是正确的。
但是,当我测试我的代码时,返回的数字(如果有)是错误的。例如,以下代码输出“false”而不是“3”:
nbNodes([8, [3, [1, [], []], [6, [4, [], []], [7, [], []]]], [10, [], [14, [13, [], []], []]]], N, 2).
我做错了什么? 非常感谢。
【问题讨论】:
-
如果你真的想了解 Prolog,我推荐阅读这本书:springer.com/gp/book/9783540006787。它写得很好,结构很好。
标签: recursion prolog binary-tree