这个在c++中查找阶乘的递归程序背后的逻辑是什么?


#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时,条件变为真并返回1。那么为什么它不输出1呢?是5*4*3*2*factorial(1)的值存储在某个地方,返回值只是与5*4*3*2*1相乘并输出120?

还请解释一下,当我们传递0而不是5时会发生什么,它将如何输出1?(0 ! = 1)

就像你说的:

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将被计算…之后,最后第三步获得2*1 = 2的值,并将3乘以in,以此类推。

如果你在你的函数中插入更小或更大的0,你将得到一个无限的递归,因为If(0 == 1)。

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

0和-number也可以

堆栈在某种意义上存储了所有挂起的操作。只要fact(2)从调用中获得1,它就将其乘以2并返回2。事实(3)接收到2,将其乘以3并返回6。事实(4)接收到6,将其乘以4并返回24。等等…

传递0在程序的当前形式中是没有考虑到的,并且实际上会导致程序崩溃(很有可能)。将if(x==1)行改为if(x==0)将解决此问题。

最新更新