鱼C论坛

 找回密码
 立即注册
查看: 4214|回复: 7

C函数问题

[复制链接]
发表于 2012-10-16 22:34:48 | 显示全部楼层 |阅读模式
3鱼币
  1. #include<stdio.h>
  2. void fun(int x)
  3. { if(x/2>0) fun (x/2-2);
  4. printf("%d ",x);
  5. }
  6. int main()
  7. { fun(20);
  8. printf("\n");
  9. return 0;
  10. }
复制代码
输出是-1 2 8 20 不明白,不是20先输出?

最佳答案

查看完整内容

你在fun()函数里又调用fun函数() 叫做递归,也就是教程说的汉诺塔吧。你把定义函数fun()里面的fun (x/2-2);替换其他算法的就正常了! void fun(int x) { if(x/2>0) fun (x/2-2); printf("%d ",x); }
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-16 22:34:49 | 显示全部楼层

你在fun()函数里又调用fun函数()
叫做递归,也就是教程说的汉诺塔吧。你把定义函数fun()里面的fun (x/2-2);替换其他算法的就正常了!

void fun(int x)

{ if(x/2>0) fun (x/2-2);
printf("%d ",x);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-16 23:06:17 | 显示全部楼层
如果对递归不太懂的童鞋,对好的办法就是单步走一走程序,监视变量的变化,还有打开栈窗口看入栈和出栈的顺序。。。。
如果非要我给你解释的话,就是递归调用刚开始参数为20,即fun(20),因为20/2 > 0,所以再调用fun(8),以此类推,依次条用fun(2),fun(-1),注意现在的参数-1,因为-1/2 < 0,所以此时递归就该到头了,这也就是递归的出口,但是请注意,到目前递归并没有结束,只能说执行了一半,因为递归跟循环最大的区别就是递归有返回,循环走完一遍也就结束了。。。所以接下来就开始返回了,也就是开始依次执行下面的printf("%d", x)代码,因此最先返回的是fun(-1),所以最先输出-1,依次类推,直到输出20,整个递归结束。
当然,我说这么多你可能完全看不懂,因为递归本身来讲如果理解了就那么回事,如果不理解在怎么看也不理解,如果楼主要真正懂的话,只有按我最上面说的那样自己去调试跟踪。。。。。通过调试跟踪看看递归执行的整个流程,当然在跟踪过程中最主要的是看栈的变化。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-18 22:49:47 | 显示全部楼层
这是递归函数。首先判断(20/2>0)?,进入(20/2-2>0)。。。一直到(2/2-2)也就是-1

补充内容 (2012-10-18 22:54):
(-1<0),然后printf(-1),接着返回上一层2,8,20.递归就是先进内层,在返回外层。你看下视频了解一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-20 10:58:54 | 显示全部楼层
这就是递归的顺序,看看书上的历程图,希望对你有帮助!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-20 11:25:51 | 显示全部楼层
fun(20)的调用在fun函数里被展开为
fun(20/2-2);
printf("%d ",20);
不管fun(20/2-2);调用是干什么的(可能会打印很多东西),它总要返回,返回后,执行printf("%d ",20);
所以最后一定打印20
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-20 11:35:05 | 显示全部楼层
递归运算 我也是刚从里边出来 调用自己的时候返回值是上一层的调用自己的函数 l例如:10=(1+(2+(3+4)))都是调用+运算 先算3+4返回值为7 因为此处有printf函数输出结果并不是程序最后判定结束的结果而是为了下一次调用+运算(2+7)的返回值 以此类推 我是这么理解的 建议进入函数单步调试比较好理解
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-20 11:36:38 | 显示全部楼层
个人感觉递归函数更像是数据的进栈过程,之后弹栈.如果不懂,那就通俗点说,有这么一个罐子,当你第一次调用fun函数的时候,就是把得到的结果放到罐子里,之后第二次调用自身的时候得到的结果放第一次的上面,之后就这样,之后到if判断条件不成立,不能再次调用自身为止,好了,我们已经把结果都放到罐子理了,现在printf了,第一次得到的结果已经被压在下面了,我们只能拿最上面的了,没printf一次拿一个,一直拿到最后一个!,个人解释,仅供参考
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 16:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表