无法 return 更正递归函数中变量的值

Unable to return correct value of a variable in a recursive function

我正在编写以下程序以递归地查找给定数字的阶乘。

#include<stdio.h>
int fact1=1;

int recursion(int x)
{
    if(x==0)
    {
        return fact1;
    }

    fact1=fact1*x;
    x--;
    recursion(x);   
}

int main()
{
    printf("%d",recursion(5));
    return (0); 
}

问题:

问题是,每当我 运行 这个程序时,它总是给我一些垃圾值 22752240 。

因此为了测试我的递归,我在递归函数中放置了 printf("%d",fact1) 以检查 fact1 在被 returned

之前是否为 120
int recursion(int x)
{
    if(x==0)
    {
        printf("%d",fact1);
        return fact1;
    }

    fact1=fact1*x;
    x--;
    recursion(x);   
}

当我执行程序时,我得到了这个 120 22752240 作为输出,这意味着 recursion() 正在打印 fact1 的正确值,但无法 return 正确的 [=14] 值=].

谁能解释为什么会这样?

当然可以。您忘记了 returnrecursion() 末尾的值。如果没有 return 语句,使用 recursion() 作为参数 ot printf() 调用 undefined behaviour.

详细说明,只有当 x == 0 为真时,您才使用 return 语句来 return 一个值。在其他情况下,您缺少 return 语句。您还需要为其他情况添加 return 语句。

参考:表格 C11 标准,章节 §6.9.1,函数定义

If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.

也就是说,main()推荐的签名是int main(void)

It is because when x becomes 0 and return statement works at that time it return value of fact to the function call recursion(1) called via recursion function not to the function call recursion(5) called from main. so the value of fact at last recursion is 120 but it is not returned to main properly.



u can do it by ommiting using fact variable

int recursion(int x)
{
    if(x==0)
    {
        return 1;
    }
    else{
        return x*recursion(--x);
    }   
}

int main()
{
    printf("%d",recursion(5));
    return (0); 
}

您忘记 return 案例 x!=0 中的某些内容,所以 return 编辑了垃圾。修改函数的最后一行,如下所示:

return recursion(x);

这将 return 递归调用计算出的值。

该函数需要return每个路径上的值,其他未定义。
您看到的打印内容是存储在函数的 return 值本应存储的位置的任何值。

但是全局变量和递归不能很好地结合在一起——你的函数应该只关心它的参数和 return 值。

如果按照阶乘的定义,几乎不需要考虑代码:

  • factorial(0) 是 1
  • factorial(x)x 乘以 factorial(x - 1)

在代码中:

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