你好我有这段代码,我根据其他一些递归和阶乘程序编码 但我的问题是,我真的很困惑它如何存储值并保留它然后在最后返回它
int factorialfinder(int x)
{
if (x == 1)
{
return 1;
}else
{
return x*factorialfinder(x-1);
}
}
int main()
{
cout << factorialfinder(5) << endl;
}
所以5进去,并通过一次又一次地调用它的函数再乘以4,然后它变为1并返回阶乘答案
为什么呢?我不知道它是如何存储的,为什么返回1返回实际答案,它到底在做什么?
答案 0 :(得分:9)
来源:图片来自:IBM Developers website
看看上面的图片,你会更好地理解它。数字永远不会被存储,但会被递归调用以计算输出。
因此,当您调用事实(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
}
}
希望这有帮助。
答案 1 :(得分:5)
返回1未返回实际答案。它只是回复了调用
的答案factorialfinder(1);
在你的代码中发生。
在任何程序中,调用堆栈是内存中用于跟踪函数调用的空间。此内存中的空间用于存储函数的参数以及该函数的返回值。每当某个函数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;这是被检查的条件。
答案 2 :(得分:2)
递归函数将一个大问题分解为更小的情况。
完成你的计划:
call factorialfinder with 5, result is stored as 5 * factorialfinder(4)
call factorialfinder with 4, result is stored as 5 * 4 * factorialfinder(3)
call factorialfinder with 3, result is stored as 5 * 4 * 3 * factorialfinder(2)
call factorialfinder with 2, result is stored as 5 * 4 * 3 * 2 * factorialfinder(1)
call factorialfinder with 1, result is stored as 5 * 4 * 3 * 2 * 1
本质上它将一系列调用的结果与factorialfinder结合起来,直到你遇到你的基本情况,在这种情况下x = 1。
答案 3 :(得分:1)
因此,阶乘函数可以使用递归来编写,但递归中的主要考虑因素是这个函数使用系统堆栈,因此,每次调用函数都是系统堆栈中的一个项目,如下所示: / p>
https://dl.dropboxusercontent.com/u/14246044/stack.png(抱歉图片,但我没有声望发布图片:()
递归函数中的其他考虑因素是该函数有两个主要代码:
在基本情况下,递归函数返回算法的更基本元素,在这种情况下,此元素为1,因为数学上第一个因子是1,但您不知道谁是其他数字的因子这个原因你必须使用公式,因此你必须使用递归的情况,例如
阶乘5,程序为:5 * 4 * 3 * 2 * 1 = 120,注意你必须将每个数字从最高值乘以第一个,换句话说,直到基本情况发生为止是你已经知道的情况。
答案 4 :(得分:0)
#include<iostream>
using namespace std;
int factorial(int n);
int main()
{
int n;
cout << "Enter a positive integer: ";
cin >> n;
cout << "Factorial of " << n << " = " << factorial(n);
return 0;
}
int factorial(int n)
{
if(n > 1)
return n * factorial(n - 1);
else
return 1;
}