如何在递归中使用返回函数

How to use return function in recursion

本文关键字:返回 函数 递归      更新时间:2023-10-16

我在下面有这个代码来顺序遍历树:

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 调用inorderr->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 语句返回到调用函数的父节点。