永发信息网

C语言阶乘问题

答案:3  悬赏:50  手机版
解决时间 2021-12-03 14:49
  • 提问者网友:我一贱你就笑
  • 2021-12-02 22:18
C语言阶乘问题
最佳答案
  • 五星知识达人网友:西岸风
  • 2021-12-02 22:24
1. 每个fact()都必须执行到return num;
2. 4 3 2 1 2 3 4前4321是由

long fact(int n)
{
printf("%d\n",n);
long num=0;
这第一个printf()输出的。
而后234是由
else
{
num=fact(n-1)*n;//这句就进去了,但!是!,函数执行完成,还是要回来的。
printf("%d\n",n);//上一句执行完了,就执行这一句,然后再执行下一句。每个函数里都是这样。
}追问后面的printf什么时候进来的,是n=2还是n=1时?这里有点晕啊说具体点追答n=2的时候
在每一个fact()的时候都会执行这一句。
但是你这里
else if(n==1||n==0)
{

num=1;
}
n==1的时候另外处理了。
所以n==1的时候就没有输出1了。
如果你这里也printf()一下。
结果就会是4 3 2 1 1 2 3 4 了
全部回答
  • 1楼网友:千夜
  • 2021-12-02 23:19
你的else 里面num=fact(n-1)*n的后面有一个printf语句,该条语句是在上一条语句中调用fact(n-1)完成并退出到这里后执行,所以就多了2,3,4
  • 2楼网友:英雄的欲望
  • 2021-12-02 23:09

因为你返回的是num,递归是用堆栈的,需要return fact(n-1)*n;  不能最后返回num,返回的num是第一次计算的值

long fact(int n)
{
    printf("%d ",n);
    long num=0;
    if(n<0)
    {
        printf("您输入的有误");
        return 0;
    }
    else if(n==1||n==0)
    {
        return 1;
    }
    else
    {
        return fact(n-1)*n;
        printf("%d ",n);
    }
}追问稍微再解释一下~~可以吗追答哪里不懂?
举个例子吧,计算fac(3) = 3*fac(2)=3*2*fac(1)
3入栈
2入栈
1入栈
之后计算fac(1)=1,此时1出栈与1相乘等于1,之后2出栈与1相乘等于2,之后3出栈与2相乘等于6,所以最后结果为6
递归是有个入栈与出栈的过程的。追问就是renturn num放在最后怎么就会出现 2 3 4呢。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯