【问题标题】:Need explanation on this line (trees, recursive)在这一行需要解释(树,递归)
【发布时间】:2020-07-15 07:34:40
【问题描述】:
BOOL hasKey(pTreeNode tree, int key)
{
    BOOL ret = FALSE;
    if (tree != NULL)
    {
        if (key == tree->key)
            ret = TRUE;
        else
                         ret = (BOOL)(hasKey(tree->left, key) || hasKey(tree->right, key)); *//here*

    }
    return ret;
}

这是一个检查给定“键”是否在树中的函数。 我不明白我发表评论的那一行背后的逻辑是什么,我也想知道这段代码是否会这样做:

BOOL hasKey(pTreeNode tree, int key)
{
    BOOL ret = FALSE;
    if (tree != NULL)
    {
        if (key == tree->key)
            ret = TRUE;
        else { ret = hasKey(tree->left,key);
               if (ret == FALSE)
                 ret = hasKey(tree->right,key);
             }

    }
    return ret;
}

我没有完整的代码,这就是为什么我不能测试两者是否相同,这是考试中的问题。

我希望一切都清楚!谢谢!

【问题讨论】:

  • 是的,基本上它们是一样的。语言中可能存在一些模糊的角落,它们可能会有所不同,但否则两者应该会产生相同的结果。

标签: c recursion tree


【解决方案1】:

是的,第二个 sn-p 是等效的。 另一种说法是

BOOL hasKey(pTreeNode tree, int key)
{
    BOOL ret = FALSE;
    if (tree != NULL)
    {
        if (key == tree->key)
            ret = TRUE;
        else if (hasKey(tree->left,key)) 
            ret = TRUE;
        else if (hasKey(tree->right,key))
            ret = TRUE;
    }
    return ret;
}

线

ret = (BOOL)(hasKey(tree->left, key) || hasKey(tree->right, key));

使用短路的logical operator ||。这意味着:

如果 lhs 的结果比较不等于 0,则根本不评估 rhs(所谓的短路评估)

也不是这个运算符的返回类型是int。这可能就是将结果显式转换为 BOOL 的原因。

【讨论】:

  • 它们与 ret = (BOOL)(hasKey(tree->left, key) || hasKey(tree->right, key)) 有何相同之处? ?我不明白这条线会发生什么,你能详细说明一下吗?
  • 我加了一点解释。
【解决方案2】:

逻辑或||(与任何其他逻辑运算符一样)不一定在 if 语句中使用:它只返回一个整数值,即 1(真)或 0(假)。 在您的情况下,您只需将此结果存储在一个变量中。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2015-03-10
    • 1970-01-01
    • 2021-11-04
    • 2017-01-09
    • 2014-06-01
    • 2020-07-04
    • 2016-11-15
    • 2022-11-10
    相关资源
    最近更新 更多