鱼C论坛

 找回密码
 立即注册
查看: 3969|回复: 15

请教C语言递归的问题,这个例子

 关闭 [复制链接]
发表于 2011-7-6 17:11:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
void up(int);
int main(void)
{
up(1);
return 0;
}
void up(int n)
{
printf("level %d: n location\n",n);
if(n<4)
{
up(n+1);
}
printf("level %d: n location\n",n);

}
运行结果是这样的:
level 1: n location
level 2: n location
level 3: n location
level 4: n location
level 4: n location
level 3: n location                   //这里之后我就不明白为什么这样
level 2: n location
level 1: n location


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-6 17:18:50 | 显示全部楼层
if(n<4)
{
up(n+1);
}

当>4的时候,程序开始执行后面的printf

所以才会出现后面的4321的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-6 17:42:44 | 显示全部楼层

但是不是n=4就跳过if就进入printf("level %d: n location\n",n);就跳出这个up函数就进入主函数,就return 0 就结束吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-6 22:11:37 | 显示全部楼层
main中调用up(1);
执行了如下的操作:

printf("level %d: n location\n",1);
up(2);
printf("level %d: n location\n",1);
我们不需要知道up(2);打印什么就可以猜到输出为:
level 1: n location
xxxxxxxxxxxx//此处为up(2)打印的内容
level 1: n location

接下来,up(2)
执行:
printf("level %d: n location\n",2);
up(3);
printf("level %d: n location\n",2);
所以前面xxxxxxxxxxxxxxxxxx处应该为:
level 2: n location
????????????????//此处为up(3)打印内容
level 2: n location

...接下去LZ自己分析吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-7 09:33:17 | 显示全部楼层
仰望天上的光 发表于 2011-7-6 22:11
main中调用up(1);
执行了如下的操作:

1.好像明白了,是不是当调用到最后一级的函数(当n=4,条件不满足),就倒回来,一步一步向上一级继续输出不满足if条件后面的语句。
2.那是不是如果if条件后面没有语句,就是失去了递归从后面倒回来的功能了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-7 09:40:41 | 显示全部楼层
吖查 发表于 2011-7-7 09:33
1.好像明白了,是不是当调用到最后一级的函数(当n=4,条件不满足),就倒回来,一步一步向上一级继续输出 ...

分析的关键在于每次分析一次函数调用,如up(1)的时候,根本不要去管up(2)怎么调用,先跳过他,把up(1)大概的样子分析好(反正up(2)之前的垦地年汇改要先执行;又up(2)调用肯定要结束,所以up(2)之后的在up(2)后也要执行)。分析完up(1)再分析up(2),再看up(3)管它是怎么返回的(因为函数返回后的行为前面已经分析过了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-7 15:17:40 | 显示全部楼层
每次调用函数UP();都会执行一次UP()中的内容;
知道if(n<4)不满足,才停止调用UP(),然后依次执行if(n<4)后面的printf("level %d: n location\n",n);
直到你最开始调用UP()那里

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-7 20:52:44 | 显示全部楼层
怎么打开代码模式:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-7 22:06:54 | 显示全部楼层
仰望天上的光 发表于 2011-7-7 09:40
分析的关键在于每次分析一次函数调用,如up(1)的时候,根本不要去管up(2)怎么调用,先跳过他,把up(1)大概 ...

很明白这个了(你意思就独个函数来分析)~我再试试分析**递归的例子~{:7_169:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-7 22:08:45 | 显示全部楼层
ly8880 发表于 2011-7-7 15:17
每次调用函数UP();都会执行一次UP()中的内容;
知道if(n

嗯嗯~~~~明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-7 22:11:14 | 显示全部楼层
moshushi 发表于 2011-7-7 20:52
怎么打开代码模式

是不是你想要这个   写帖子右上角右数第二个 就可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-8 00:29:46 | 显示全部楼层
这是不是就是所谓的递归堆栈?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-8 12:23:32 | 显示全部楼层
吖查 发表于 2011-7-7 22:11
是不是你想要这个   写帖子右上角右数第二个 就可以

找不到 给一个截图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-8 13:53:57 | 显示全部楼层
你是想干嘛?你在调用UP函数的时候,并没有中断当前函数的执行,等函数都调用完后,又依次回来一一调用! 因为你这样写,要理解程序执行流程确实很难,现在在公司,编译器都没有,你单步调试就知道怎么回事了?其实主要就是后面还跟了个printf函数,每调用依次UP函数后面的printf都得执行,但是因为调用了**函数,得等函数调用完之后,在返回来执行后面的printf函数,所以在条件不满足的时候,程序就开是一层层返回主调函数,一次次执行printf函数!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-8 23:20:19 | 显示全部楼层
weixianlang 发表于 2011-7-8 13:53
你是想干嘛?你在调用UP函数的时候,并没有中断当前函数的执行,等函数都调用完后,又依次回来一一调用! 因 ...
其实主要就是后面还跟了个printf函数,每调用依次UP函数后面的printf都得执行,但是因为调用了**函数,得等函数调用完之后,在返回来执行后面的printf函数

嗯嗯 你这样说,我也很认同这个的~~~有点像解决我5楼提出那些问题
还有6楼版主这样说的也挺好的~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-11 11:55:46 | 显示全部楼层
楼主 应该多分析分析几个递归的例子就好了、总之记住一点 所谓递归就是一个函数反复调用自身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-7 23:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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