【问题标题】:How does a recursive method count without a counter?没有计数器的递归方法如何计算?
【发布时间】:2015-04-17 13:41:18
【问题描述】:

我正在为二叉搜索树编写方法,但无法理解递归的基础知识。我找到了一种检查二叉搜索树大小的方法,我看到它是如何遍历树的每个元素的,但我不明白它是如何准确计算大小的。有人可以向我解释一下吗?

方法如下:

unsigned long BST::sizeHelper(BSTNode* r){
    if (r == NULL){
        return 0;
    } else {
        return (sizeHelper(r->left) + sizeHelper(r->right) + 1); //+1 for the root
    }
}

我看到了 return 语句,但我没有看到任何迹象表明它是如何计算通过它们的元素的。

【问题讨论】:

  • 你觉得+ 1在那里做什么?
  • @n.m.我认为 OP 理解 something 正在增加;我预计这种混淆是因为在任何地方都没有代表“当前计数”的单个变量。对吧,Xerunix?
  • @n.m.感谢您向我指出这一点。我实际上虽然 +1 添加了根,因为子树不包含它,但现在我意识到它正在将 +1 返回给调用它的递归方法。太感谢了。你也是凯尔。我没有意识到 return 关键字向调用它的方法返回了一个值……或者至少没有递归地考虑它。
  • 您已经正确描述了它的工作原理。计算右手子树的大小,计算左手子树的大小,把它们加起来,加 1。为什么你认为你需要跟踪任何额外的信息,或者在某个地方有一个隐藏的计数器?或许您应该自己编写一个递归阶乘函数(将所有中间结果存储在命名变量中的函数)并使用调试器运行它。
  • @n.m.直到你让我质疑 +1 的作用之后,我才明白它是如何工作的。我以为它只是在计算根节点。

标签: c++ recursion


【解决方案1】:

每次返回时,该方法将至少加到总大小上。 例如,考虑以下树:


(我画画不好,所以在网上偷了一张)

步骤如下:

  1. 从A开始,return size(B) + size(C) + 1
  2. 对于 B,return size(D) + 0 + 1。 (0 因为 B 没有正确的孩子,即 NULL)
  3. 对于 D,return 0 + 0 + 1。尺寸(D) = 1。
  4. 现在回过头来,size(B) = 1 + 1 = 2。
  5. 对于 C,return size(E) + size(F) + 1
  6. 与 D 类似,size(E) = size(F) = 1。
  7. 再回头,size(C) = 1 + 1 + 1 = 3。
  8. 最后,size(A) = 2 + 3 + 1 = 6。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多