在递归函数中返回

nou*_*oir 2 c recursion return-value function-definition

我试图了解如何在 C 中使用递归,但我不知道return它是如何工作的。

请考虑以下代码:

int     recur(int i)
{
    printf("recur: i = %d\n", i);
    if (i < 3)
    {
        recur(i + 1);
        return 10;
    }
    else if (i < 5)
        recur(i + 1);
    return i;
}

int     main(void)
{
    int     i = 0;
    i = recur(i);
    printf("i = %d\n", i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

recur: i = 0
recur: i = 1
recur: i = 2
recur: i = 3
recur: i = 4
recur: i = 5
i = 10
Run Code Online (Sandbox Code Playgroud)

最后一个返回,return i,做什么?这段代码甚至有意义吗?

Vla*_*cow 6

函数的递归调用不会影响返回值。只有在return递归函数的第一个实例中遇到的第一个才会向父函数返回一个值。任何其他return遇到的只会停止程序当前所在的函数实例。

因此,由于函数在 main 中被调用,参数为 0

int     i = 0;
i = recur(i);
Run Code Online (Sandbox Code Playgroud)

第一次return见面位于if声明中:

if (i < 3)
{
    recur(i + 1);
    return 10;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,recur在将值返回给 之前调用该函数main。它将创建另一个实例,recur它会做一些事情,但是在这个实例recur结束后,主实例recur将继续,在这种情况下,将返回 10 给函数main。

要知道您的递归函数将返回什么main函数,您可以简单地注释对该函数的新实例的所有调用:

int     recur(int i)
{
    if (i < 3)
    {
        //recur(i + 1);
        return 10;
    }
    else if (i < 5)
    {
        //recur(i + 1);
    }
    return i;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这就是程序将读取的内容:

int     recur(int i)
{
    if (i < 3)
        return 10;
    return i;
}
Run Code Online (Sandbox Code Playgroud)