如何在递归中使用return函数

时间:2017-06-01 06:25:03

标签: c++ recursion

我正在使用以下代码进行树的顺序遍历:

void inOrder(struct node* r)
{
    if (r==NULL)
    return;

    else
    {
        inOrder(r->left);
        printf("%d ", r->value);
        inOrder(r->right);
    }
} 

我有这个愚蠢的怀疑:

当最左边的子项以root身份传递时,它不为null。 在下一次迭代中,root将为null(因为最左边的子项的左子项将为null)并且它将遇到return。

这个return语句不会将控件传递给main函数(或者调用它的任何地方)而不打印任何内容?

返回时返回的行为是否有所不同?

3 个答案:

答案 0 :(得分:1)

return会将控制权传递回当前"层"的位置。调用函数。

函数调用在一个名为stack的结构中组织。想象一下,您的计算机中有一个盒子。计算机可以将一个元素放入框中(在框中的其他元素的顶部),或者它可以删除框顶部的元素。请考虑以下代码。

void f(int x)
{
    if (x == 0)
        return;
    f(x - 1);
}

如果您在主要功能中拨打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)。 <{1}}返回时的情况相同。

答案 1 :(得分:0)

  

当最左边的子项以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{
  inOrder(r->left);

这里,它再次调用相同的函数,因此,当前执行将暂停一会儿,并在此调用返回时恢复。

现在,inOrder(r->left);再次使用inOrder(struct node* r);作为参数null致电r。因为,你传递的是r->left,这是空的。

因此,此inorder的来电将会点击return

if (r==NULL) return;

当它返回时,它将恢复暂停的inorder呼叫的最后一个实例 inOrder(r->left);致电。

  

这是可能的,因为无论何时从a内部调用函数   函数维持call stack.

现在,恢复后会执行下一行

printf("%d ", r->value);

将在最左下方的节点中打印该值。

最后,它将调用最后一行

inOrder(r->right);将再次暂停当前函数的执行,并在保存调用堆栈中的当前函数状态后,它将再次调用inorder为null r->right,这将再次从

if (r==NULL) return;

最后它会回到inorder的原始执行并继续执行,因为没有任何指令,如果你从那里调用并恢复main中剩下的内容,它将返回main方法。

所以,你的答案是它只打印最左边节点的值。

答案 2 :(得分:0)

递归的经典示例可能更好地说明问题

int factorial(int n)
{
    if(n == 0)
        return 1;
    return n * factorial(n - 1);
}

如果我们要调用factorial(3),它将递归调用factorial直到基本情况n == 0,此时,控制流将返回到调用它的位置, factorial(1)而不是main

所以,不,你的return语句会回到调用函数的父节点。