无法在递归函数中返回变量的正确值

时间:2015-06-02 09:15:47

标签: c function recursion return factorial

我正在制作以下程序,以递归方式查找给定数字的阶乘。

#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是否为120

int recursion(int x)
{
    if(x==0)
    {
        printf("%d",fact1);
        return fact1;
    }

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

当我执行程序时,我得到120 220752240作为输出,这意味着recursion()打印正确的fact1值,但无法返回fact1的正确值。

任何人都可以解释为什么会这样吗?

4 个答案:

答案 0 :(得分:3)

不确定。您忘记了return recursion()末尾的值return。如果没有recursion()语句,使用printf()作为参数x == 0会调用undefined behaviour

详细说明,仅针对return为TRUE的情况,您使用return语句返回值。在其他情况下,您错过了return语句。您还需要为其他案例添加C11语句。

参考:表格}标准,章节§6.9.1,功能定义

  

如果到达了终止函数的main(),并且调用者使用了函数调用的值,则行为未定义。

尽管如此,int main(void)的推荐签名是{{1}}。

答案 1 :(得分:0)

您忘记在案例x!=0中返回某些内容,因此返回了垃圾。修改函数的最后一行,如下所示:

return recursion(x);

这将返回递归调用计算的值。

答案 2 :(得分:0)

该函数需要在每个路径上返回一个值,其他任何内容都是未定义的 你所看到的是你应该存储函数返回值的地方存储的任何值。

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

如果你遵循阶乘的定义,你几乎不需要考虑代码:

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

在代码中:

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

答案 3 :(得分:-1)

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); 
}