如何在递归中使用返回函数
How to use return function in recursion
我在下面有这个代码来顺序遍历树:
void inOrder(struct node* r)
{
if (r==NULL)
return;
else
{
inOrder(r->left);
printf("%d ", r->value);
inOrder(r->right);
}
}
我有这个愚蠢的怀疑:
当最左下角的子项作为 root 传递时,它不为 null。 在下一次迭代中,根将为 null(因为最底部的左子项将为空),并且它将遇到返回。
这个 return 语句不会在不打印任何内容的情况下将控件传递给 main 函数(或调用它的任何位置)吗?
返回在递归中的行为是否不同?
此return
会将控件传递回调用当前函数"层"的位置。
函数调用组织在称为堆栈的结构中。想象一下,您的计算机中有一个盒子。计算机可以将元素放入框中(在框中其他元素的顶部),也可以删除框顶部的元素。请考虑以下代码。
void f(int x)
{
if (x == 0)
return;
f(x - 1);
}
如果在 main 函数中调用f(2)
,计算机会将f(2)
放入框中。当执行f(2)
时,它会在函数内部调用f(1)
,因此计算机将f(1)
放入盒子中(在f(2)
之上)。正如f(1)
也称f(0)
,计算机将f(0)
放入盒子中。
执行f(0)
时,不调用任何内容,并且它符合return
指令。因此,计算机从盒子中删除f(0)
,f(1)
现在位于盒子顶部。所以你的电脑知道是f(1)
而不是main
调用f(0)
,所以它将继续执行f(1)
。返回f(1)
时也是如此。
当最左下角的子项作为 root 传递时,它不为 null。
void inOrder(struct node* r)
{
if (r==NULL)
return;
else{
inOrder(r->left);
printf("%d ", r->value);
inOrder(r->right);
}
}
在上面的代码中,当您将最左下角的孩子作为 root 传递时。
它首先执行此行
if (r==NULL) return;
由于r
目前不为空,因此它将跳过此返回。
在 else 部分中,它现在将执行
else{
inOrder(r->left);
在这里,它再次调用相同的函数,因此,当前执行将暂停片刻,并在此调用返回时恢复。
现在,inOrder(r->left);
再次调用inOrder(struct node* r);
,null
作为此调用的参数r
。 因为,您正在传递r->left
这是空的。
所以,这个对inorder
的呼吁将击中return
if (r==NULL) return;
当它返回时,它将恢复inorder
调用的最后一个实例,该实例在inOrder(r->left);
电话。
这是可能的,因为每当从内部调用函数时 函数是维护一个调用堆栈。
现在,恢复后它将执行下一行
printf("%d ", r->value);
这将打印最左下角节点中的值。
最后,它将调用最后一行
inOrder(r->right);
将再次暂停当前函数的执行,并在调用堆栈中保存函数的当前状态后,它将再次使用 null 调用inorder
r->right
它将再次从
if (r==NULL) return;
最后,它将返回到inorder
和恢复的原始执行,并且由于没有剩余的指令,如果您从那里调用并恢复 main 中剩余的内容,它将返回到main
方法。
因此,您的答案是它将仅打印最左下角节点中的值。
递归的经典示例可能更好地说明问题
int factorial(int n)
{
if(n == 0)
return 1;
return n * factorial(n - 1);
}
如果我们要调用factorial(3)
,它将递归调用factorial
,直到基本情况n == 0
,此时,将控制流返回到调用它的点,即factorial(1)
而不是main
。
因此,不,您的 return 语句返回到调用函数的父节点。
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数