#include<iostream>
using namespace std;
int factorial(int x)
{
if(x == 1)
{
return 1;
}
else
{
return x*factorial(x-1);
}
}
int main()
{
cout<<factorial(5)<<endl;
}
当值达到1时,我没有得到该部分。为什么程序不打印1作为输出,因为当达到1时它返回1.考虑以下步骤。
5*factorial(4)=5*4*factorial(3)=5*4*3*factorial(2)=5*4*3*2*factorial(1)
现在,当x
值变为1并进入if时,condition变为true并返回1。那么为什么输出1呢?是5*4*3*2*factorial(1)
的值存储在某个地方,而just的返回值是否乘以5*4*3*2*1
并输出120?
另外请解释一下,当我们传递0而不是5时会发生什么,它将如何输出1? (0!= 1)
答案 0 :(得分:3)
就像你说的那样:
5*factorial(4)=5*4*factorial(3)=5*4*3*factorial(2)=5*4*3*2*factorial(1)
因此,如果它达到1,那么这将被
取代5*factorial(4)=5*4*factorial(3)=5*4*3*factorial(2)=5*4*3*2*1
所以最后一步的结果进入第二步......其中2 * 1将被计算...之后第3步最后一步获得2 * 1 = 2的值并且在3中相乘等等。
如果在函数中插入小于或等于0,则会得到无穷无尽的递归,因为if(0 == 1)。但是,如果用
替换此代码int factorial(int x)
{
if(x <= 1)
{
return 1;
}
else
{
return x*factorial(x-1);
}
}
然后0和-numbers也会起作用
答案 1 :(得分:1)
堆栈在某种意义上存储所有待处理的操作。一旦事实(2)从调用中得到1,它将它乘以2并返回2.事实(3)接收该2,将其乘以3并返回6.事实(4)接收该6,将其乘以4并返回24.等等......
在程序的当前形式中没有考虑传递0并且实际上会导致程序崩溃(最有可能)。将if(x == 1)行更改为if(x == 0)将解决此问题。