|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- long a (long b,long c);
- long a (long b,long c)
- {
- if (b--)
- {
- c *= (b+1);
- a(b ,c);
- }
- return c;
- }
- int main(void)
- {
- long b = 0;
- long c = 1;
- printf("求正整数阶乘,请输入正整数:\n");
- scanf("%d",&b);
- printf("阶乘为:%ld",a(b,c));
- }
复制代码
--------------------------------------------------------------
- #include <stdio.h>
- int x = 5;
- int y = 1;
- int a(void);
- int a(void)
- {
- if (--x)
- {
- y *= (x+1);
- a();
- }
- }
- int main(void)
- {
- a();
- printf("%d\n",y);
- }
-
复制代码
这是我自己写的代码,为什么第二个代码可以实现,而第一个代码不能实现,头疼炸裂,望各位不吝赐教
你第一段代码的第 9 行直接调用了它本身,看似毫无问题,但是你在它本身里面对于参数做出的任何修改退出这层函数之后都会被析构掉,什么也没有留下,所以你调用 a(b, c) 是完全没有意义的。
在第二段代码中, b 和 c 声明为全局变量,在函数里面因为没有覆盖全局变量,默认都是修改全局变量,因此它留下了痕迹。
你可以在第一段代码中将传参改为传指针,就好了。
以下将模仿你在第一段代码的运行逻辑:
代码位置 | 代码 | 运行完该行后该层级的变量 | 备注 | 18 | long b = 0; | b = 0 | | 19 | long c = 1; | b = 0
c = 1 | | 21 | printf("求正整数阶乘,请输入正整数:\n"); | b = 0
c = 1 | | 22 | scanf("%d", &b) | b = 3
c = 1 | 我们假如输入了 3 | 23 | printf("阶乘为:%ld",a(b,c)); | b = 3
c = 1 | 开始调用 a 函数 | 23>6 | if (b--) | b = 2
c = 1 | b - 1 = 2 | 23>8 | c *= (b+1) | b = 2
c = 3 | c * (b + 1) = 3 ,这里对 c 做出的改变不会反馈到 main 函数中 | 23>9 | a(b ,c); | b = 2
c = 3 | 进行递归,但是递归是无效的,因为递归的结果并不会返回,也不会被保留 | 23>9>6 | if (b--) | b = 1
c = 3 | b - 1 = 1 | 23>9>8 | c *= (b+1) | b = 1
c = 6 | c * (b + 1) = 6 ,这里对 c 做出的改变不会反馈到上一层函数中 | 23>9>9 | a(b ,c); | b = 1
c = 6 | 进行递归,但是递归是无效的,因为递归的结果并不会返回,也不会被保留 | 23>9>9>6 | if (b--) | b = 0
c = 6 | b - 1 = 0 | 23>9>9>11 | return c; | b = 0
c = 6 | 返回了 c 的值,但是返回后没有任何变量接收 | 23>9>11 | return c; | b = 0
c = 6 | | 23>11 | return c; | b = 0
c = 3 | 可以看到,上一阶段的函数运行是没有意义的, c 的值没有改变 | 23 | printf("阶乘为:%ld",a(b,c)); | b = 3
c = 1 | 可以看到,上一阶段的函数运行是没有意义的, c 的值没有改变 |
|
|