rfact(n-1)一直都没有执行到return ans那句?是什么情况?

#include<stdio.h>
long fact (int n);
long rfact (int n);

int main(void)
{
int num;

printf("这个程序是计算阶乘的.\n");
printf("输入一个范围 0-12 (q为退出):\n");
while(scanf("%d",&num)==1)
{
if(num<0)
printf("不能是负数. 请重新输入. \n");
else if(num>12)
printf("不能大于 12.\n");
else
{
printf("loop: %d factorial = %ld\n",num,fact(num));
printf("recursion: %d factorial = %ld\n",num,rfact(num));
}
printf("输入一个范围 0-12 (q为退出):\n");
}
printf("Bye.\n");

return 0;
}

long fact(int n)//使用循环计算阶乘
{
long ans;

for(ans=1;n>1;n--)
ans*=n;

return ans;
}

long rfact(int n)//使用递归计算阶乘
{
int ans;

if(n>0)
ans=n*rfact(n-1);//这个递归是怎么算的啊...rfact(n-1)一直都没有执行到return ans那句啊.那它怎么返回值啊.没返回值怎么计算类?头晕中~~~
else
ans=1;
return ans;
}
好心帮帮我吧...我在递归这真的很迷茫啊~~~~

阿晨1998
浏览 224回答 2
2回答

慕斯709654

if(n>0)ans=n*rfact(n-1);elseans=1;return ans;当n>0时,执行ans=n*rfact(n-1);,进行rfact压栈,参数为n-1可见,每次压栈时,参数都递减1,直到n=0。当某一次执行rfact函数时,n=0了,则if(n>0)不成立,执行else语句,将ans赋值为1,在else执行完毕后,继续执行后面的return ans;,这里就是递归的出口了,从这里开始,依次退栈

杨魅力

举个例子 rfact(2)=2*rfact(1) = 2*1*rfact(0) = 2*1*1(因为rfact(0) = 1)这样不就出来啦?
打开App,查看更多内容
随时随地看视频慕课网APP