C语言阶乘递归调用,这个怎么解释?

hxd198 2014-10-21 10:43:34
#include<stdio.h>
int fun(int);
int main()
{
int num,sum;
printf("请输入你要进行的阶乘数:\n");
scanf("%d",&num);
getchar();
sum=fun(num);
printf("结果为:sum=%d\n",sum);
}

int fun(n)
{
if(n==1)
{
return 1;
}else
{
return n*fun(n-1);//1
// return n*fun(--n); 2
}
}

运行1 时能得到正确结果,运行2 时结果总是少第一个num, n*fun(--n)是怎么执行的,为什么和n*fun(n-1)结果不一样呢?
...全文
177 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗博士 2014-10-24
  • 打赏
  • 举报
回复
引用 4 楼 gold615 的回复:
想起来了,这个有个执行顺序的问题,栈是后进先出,因此是先执行--n,然后才是 n*fun(--n)。
这个说法有问题。 支持1、2楼。
gold615 2014-10-23
  • 打赏
  • 举报
回复
想起来了,这个有个执行顺序的问题,栈是后进先出,因此是先执行--n,然后才是 n*fun(--n)。
赵4老师 2014-10-22
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
brookmill 2014-10-21
  • 打赏
  • 举报
回复
brookmill 2014-10-21
  • 打赏
  • 举报
回复
return n*fun(--n); 编译器有可能先处理--n,改变了n的值,结果就变成了(n-1) * fun(n-1)

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧