【问题标题】:Counting zero nodes in binary tree in prolog在序言中计算二叉树中的零节点
【发布时间】:2015-11-22 21:17:32
【问题描述】:

我编写了用于计数零值节点的谓词,但计数器 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).

谁能帮忙?

【问题讨论】:

  • 请解释这段代码在哪些方面是“不正确的”。
  • Num1 is Num + 1,而不是Num1 = Num + 1=/2 是一个统一运算符,而不是赋值。除非你使用 Visual/Turbo/PDC Prolog。
  • @lurker 我在 Visual Prolog 中编写,is 而不是 = 会导致错误。
  • @ScottHunter Num1 在程序结束时等于 2。
  • @dedmarkel 好的,然后忽略我的评论。 Visual Prolog 不遵循标准。

标签: tree prolog binary-tree


【解决方案1】:

您对计数的递归计算是向后的。你从一个未实例化的计数开始,然后加 1 直到你到达一个空节点并且不改变计数。所以计数永远不会初始化,也永远不会返回。

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

countZeros(empty, 0).

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

countZeros(tree(0, Left, Right), Num) :-
    countZeros(Left, Num1),
    countZeros(Right, Num2),
    Num is Num1 + Num2 + 1.

类似地,如果当前节点不是0,那么零的个数就是左分支的零个数加上右分支的零个数。 p>

countZeros(tree(X, Left, Right), Num) :-
    dif(X, 0),
    countZeros(Left, Num1),
    countZeros(Right, Num2),
    Num is Num1 + Num2.

您需要将这些操作转换为 Visual Prolog。 (我不知道“术语不同”的运算符,而我在上面使用dif(X, 0)。我使用的是is/2而不是=/2。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-02-21
    • 1970-01-01
    • 2019-05-12
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多