递归中的默认返回值

Default return value in recursion

本文关键字:返回值 默认 递归      更新时间:2023-10-16

请考虑以下众所周知的代码来查找数字的阶乘。

int fact(int num)
{
    if (num != 1)
        return num * fact(num - 1);
    else
        return num;
}

现在考虑相同的另一个变体

int fact(int num)
{
    if (num != 1)
        return num * fact(num - 1);
}

第一个看起来很干净,如果我们给出 num 为 4,它将是 4*3*2*1 .第二个也工作正常,即使编译器可能会发出警告。但在后一种中,如果num变为 1,则没有返回语句。那么计算是如何发生的呢?如果num为 1,则代码仅在返回 1 时有效。任何人都可以解释一下这里发生了什么4*3*2*x.x 如何返回为 1。谢谢。

编辑:我正在使用gcc 4.8.2

第二个变体是不正确的,没有"默认返回值"这样的东西,该行为是完全未定义的!

想想看,编译器怎么会知道fact(1) == 1??

如果你让我猜,我会说你想避免使用else的东西,在这种情况下,默认返回值应该是最后一句话。

int fact(int num)
{ // pre: num > 0
    if (num != 1)
        return num * fact(num - 1); 
    return num;
}

第二段代码不正确,您认为不重要的警告可能是这样的:

警告:控制达到非无效功能结束

您必须在所有路径中提供返回值,否则(当num 1时(它是未定义的行为,没有默认返回值(main 除外(。

这是一个未定义的行为,这意味着结果完全取决于特定的编译器。因此,我认为您应该尽量避免它。