【问题标题】:difference in return recursion call and just a recursion call返回递归调用和只是递归调用的区别
【发布时间】:2019-04-03 23:16:58
【问题描述】:

我目前正在为二叉搜索树编写中序遍历,而我编写的函数工作正常,我有一个关于如何递归调用此函数的问题。

下面是我写的函数,目前使用这个实现的输出是正确的。

 if(root == nullptr)
    return;

inorderDump(root->leftSubtree());
cout << root->value() << endl;
inorderDump(root->rightSubtree());

我的问题是为什么这些递归调用不需要返回语句?下面用return语句写的完全一样的函数是行不通的。

下面是使用 return 语句但没有得到正确输出的相同函数的示例。

 if(root == nullptr)
    return;

return inorderDump(root->leftSubtree());
cout << root->value() << endl;
return inorderDump(root->rightSubtree());

所以我想简而言之,我想说的是递归调用带有和不带有 return 语句的函数有什么区别,你什么时候选择一个而不是另一个? 谢谢!

以下是我用来测试这些递归函数的示例数据。

16000 24507 64025 99756 114258 163016 196448 198668

【问题讨论】:

  • "下面是我写的函数" - 我看不到函数定义。
  • 好吧,在第二个中,return inorderDump(root-&gt;leftSubtree()); 之后的任何内容都不会被执行。

标签: c++ recursion binary-search-tree


【解决方案1】:

是的,仅调用递归语句与使用返回语句调用它实际上是有区别的。由于递归使用堆栈来维持其先前的状态,如果我们不使用 return 语句,当前状态的输出或任何不会传递到先前状态的东西,因此有可能得到错误的答案。 如果您使用 return 语句,那么您基本上会将当前状态的输出返回到递归堆栈中存在的前一个状态。

【讨论】:

    【解决方案2】:

    在第二个中,程序只会遍历所有左子树,直到找到一个空值,并且什么也不做,因为 return 语句会让你退出函数,所以它不会遍历右子树或打印任何东西。

    【讨论】:

      【解决方案3】:

      递归包括从被调用函数调用调用函数。

      为了结束递归调用链,必须有一个退出条件。

      提出的问题表明递归调用依赖于返回的东西。这不是问题。这是由阶乘和斐波那契练习带来的可以理解的混淆。

      在上面的示例 1 中,递归输出表现为输出到 std::cout。

      在示例 2 中,对 return 的双重调用会适得其反——因为永远无法执行第二次 return——因为函数的线程在第一次调用时终止。示例 2 调用自身,并不意味着第二次 return 会被执行。

      有递归函数,典型的斐波那契问题最为人所知,其中函数对后续层进行两次调用。但是,这两个调用要么作为没有返回的单独调用被调用,要么作为加法调用,返回返回一个总和。

      同样,递归并不要求函数返回值。

      【讨论】:

        【解决方案4】:

        我不知道你的困惑到底在哪里,所以我会在这里撒一张更广泛的网。

        递归与返回无关,与调用有关。

        这就是递归:

        ... foo(...)
        {
            ...
            ... foo(...)...
            ...
        }
        

        foo 是一个函数,它接受任意数量和种类的参数并返回任何内容(包括 void 也就是不返回任何内容)。如果您在foo 内部的某个地方调用foo,则foo 是递归的。而已。这是递归。一个调用自身的函数。

        你的函数(第一个)有一个cout 指令,它将打印当前节点。 return 没有任何目的。

        第二个版本的问题很简单:在递归调用树的左侧之后,函数立即返回,永远不会到达cout 语句,因此永远不会打印并且永远不会执行树的右侧递归。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-27
          • 2011-01-22
          • 2016-03-21
          • 2019-10-18
          • 2011-09-16
          相关资源
          最近更新 更多