c ++ Factorial Program中的递归

uil*_* kk 0 c++ recursion

你好,我有这段代码,我根据其他一些递归和阶乘程序编码,但我的问题是,我真的很困惑如何存储值并保留它,然后在最后返回它

int factorialfinder(int x)
{
    if (x == 1)
    {
        return 1;
    }else
    {
        return x*factorialfinder(x-1);
    }
}
int main()
{
  cout << factorialfinder(5) << endl;
}
Run Code Online (Sandbox Code Playgroud)

因此5进入,并通过一次又一次地调用它的函数乘以4,然后它变为1并返回阶乘答案

为什么?我不知道它是如何存储的,为什么返回1返回实际答案,它到底在做什么?

JNL*_*JNL 9

来自IBM开发人员网站的递归图像.

来源:图片来自:IBM Developers网站

只要看看上面的图片,你就会更好地理解它.数字永远不会被存储,但会递归调用以计算输出.

因此,当您调用事实(4)时,当前堆栈用于存储每个参数,因为递归调用发生在factorialfinder(1).所以计算如下:5*4*3*2*1.

int factorialfinder(int x)         
{
    if (x == 1)        // HERE 5 is not equal to 1 so goes to else
    {
        return 1;
    }else
    {
        return x*factorialfinder(x-1); // returns 5*4*3*2*1  when x==1 it returns 1
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 图片是一个很好的开始,但答案错过了一个关键点:堆栈用于存储每个参数,因为递归调用发生在`factorialfinder(1)`.当递归调用"解开"(返回)时,每个参数依次从堆栈中拉出并乘以累积乘积.因此确实会存储每个参数.这是递归的关键部分.递归调用管理程序员的堆栈. (2认同)

mad*_*tya 5

返回1未返回实际答案.它只是回复了呼唤的答案

factorialfinder(1);
Run Code Online (Sandbox Code Playgroud)

这在您的代码中发生.

在任何程序中,调用堆栈是内存中用于跟踪函数调用的空间.此内存中的空间用于存储函数的参数以及该函数的返回值.每当某个函数A调用另一个函数B时,A从该空间获得B的返回值.

递归函数没什么特别的,它只是一个调用另一个函数的普通函数(碰巧本身就是这样).所以真的,当一个递归函数F调用自身时,它调用另一个函数:F调用F',调用F'',调用F'''等等.它只是F,F'',F'''等执行相同的代码,只需使用不同的输入.

表达式if (x == 1)用于检查何时应停止此过程.F''的返回值由F''使用.F'的返回值由F'使用.F'的返回值由F.使用.

在一些数的因子中,操作是(n)*(n-1)*(n-2)*....*(1).我突出了1; 这是被检查的条件.