又一个递归题,C的~~~

来源:百度知道 编辑:UC知道 时间:2024/06/07 01:43:54
#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*

又是你啊

if(n>0)
ans=n*rfact(n-1);
else
ans=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)

这样不就出来啦?