你好,我有这段代码,我根据其他一些递归和阶乘程序编码,但我的问题是,我真的很困惑如何存储值并保留它,然后在最后返回它
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返回实际答案,它到底在做什么?
来源:图片来自: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)
希望这可以帮助.
返回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; 这是被检查的条件.