返回递归调用和仅递归调用的区别

difference in return recursion call and just a recursion call

本文关键字:调用 递归 区别 返回      更新时间:2023-10-16

我目前正在为二进制搜索树编写一个有序遍历,而我编写的函数工作正常,我有一个问题是如何递归调用这个函数。

下面是我编写的函数,使用此实现的输出当前是正确的

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语句的函数之间有什么区别,以及你什么时候选择了一个而不是另一个?谢谢

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

16000245076402599756114258163016196448198668

是的,只调用递归语句与使用返回语句调用其实是有区别的。由于递归使用堆栈来保持其先前的状态,如果我们不使用返回语句,则当前状态的输出或其他内容将不会传递到先前的状态中,因此有可能得到错误的答案。如果使用return语句,那么基本上将当前状态的输出返回到递归堆栈中的上一个状态。

在第二个函数中,程序只会遍历所有左边的子树,直到找到一个null值,而不执行其他操作,因为return语句会让你退出函数,所以它不会遍历右边的子树或打印任何内容。

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

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

所提出的问题表明,递归调用依赖于返回某些内容。事实并非如此。这是一个可以理解的混淆带来的阶乘和斐波那契练习。

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

在示例2中,当函数的线程以第一次调用终止时,对返回的双重调用会适得其反,因为第二次返回永远无法执行。示例2调用自身这一事实并不意味着将执行第二个返回。

有递归函数,典型的fibonacci问题最为人所知,其中函数对后续层进行两次调用。然而,这两个调用要么作为单独的调用调用而不返回,要么作为加法调用而返回一个和。

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

我不知道你的困惑到底在哪里,所以我会在这里撒下更大的网。

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

这就是递归:

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

foo是一个接受任何数量和类型的参数并返回任何内容(包括void,也就是不返回任何内容(的函数。如果在foo中的某个位置调用foo,则foo是递归的。就是这样,这是递归。一个调用自身的函数。

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

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