| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 545 人关注过本帖
标题:关于自身递归的疑惑
只看楼主 加入收藏
ybyc9999
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2015-1-24
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:10 
关于自身递归的疑惑
#include <stdio.h>
void dec_bin(const int x){
     if(x/2>0){
         dec_bin(x/2);
         printf("%d",x%2);
     }
     else
         printf("%d",x);
}

int main(void){
    int data=0;
    printf("Please input a number:");
    scanf("%d",&data);

    printf("The %d's binary mode is:",data);
    dec_bin(data);
    printf("\n");
    return 0;
}

程序第四行掉用自身之后,还会执行第五行的printf语句吗?
我的理解是,第四行调用自身后,然后直接又从第四行开始执行了?

搜索更多相关主题的帖子: include number return 五行 
2015-01-24 10:20
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:19 
只要递归条件不造成死循环,会执行递归后的语句的。如果实在不好理解的话,可以把递归函数分解成n个执行相同功能的函数,就可以理解了。
比如main调用1,1调用2,2调用3,3调用4,到4时符合解套条件,则4返回到3,执行递归后语句,3返回到2执行递归后语句,2返回到1执行递归后语句,1就返回到main了,1、2、3、4是完全相同的函数。

[ 本帖最后由 wmf2014 于 2015-1-24 10:39 编辑 ]

能编个毛线衣吗?
2015-01-24 10:32
ybyc9999
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2015-1-24
收藏
得分:0 
回复 2楼 wmf2014
恩,谢谢,现在还有两个问题
1、dec_bin这个函数没有返回值,main函数调用的话会不会有问题
2、如果我输入10的话,按程序执行顺序应该得出结果0101,但是实际输出是1010,这个不太理解
2015-01-24 11:02
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
我觉得没错哦,10的二进制不就是1010么,0101是5.

能编个毛线衣吗?
2015-01-24 11:13
ybyc9999
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2015-1-24
收藏
得分:0 
回复 4楼 wmf2014
第4行和第5行,是先调用函数然后执行printf程序的话,那会一直先调用这个函数,然后执行到第4行又会重新调用,那么永远都执行不到第5行了。
照这样理解的话就出错了,为什么程序还能正确执行。
2015-01-24 12:09
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 5楼 ybyc9999
你看不到是有条件调用么?每次调用都x/2,最终有一次x/2=0,就不满足if(x/2>0)的条件了,不再自己调用自己,函数就一级级返回了。

能编个毛线衣吗?
2015-01-24 13:06
ybyc9999
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2015-1-24
收藏
得分:0 
回复 6楼 wmf2014
函数一级级的返回的话,那么打印的顺序就是逆向打印了吗?
可以这样理解么,调用的话是一级一级调用,从最后返回的时候就开始执行printf语句了,然后一直执行到最初调用的地方吗?


[ 本帖最后由 ybyc9999 于 2015-1-24 13:38 编辑 ]
2015-01-24 13:36
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
void dec_bin(const int x){
1     if(x/2>0){
2         dec_bin(x/2);
3         printf("%d",x%2);
     }
     else
4         printf("%d",x);  //这个一定第一个输出,并且肯定是1
}

这个递归函数语句3和4为输出语句,假设x初始值为7,则执行顺序如下:
1:x=7, x/2=7/2=3>0,执行2,递归1(x/2=7/2=3)
2:x=3, x/2=3/2=1>0,执行2,递归2(x/2=3/2=1)
3:x=1, x/2=0,不符合条件,执行4,printf x,显示1,返回到递归2
4:递归2结束,此时x=3,执行3,printf x%2,3除2的余数为1,显示1,返回到递归1
5:递归1结束,此时x=7,执行3,printf x%2,7除2的余数为1,显示1,
6:返回到main,最后屏幕显示为111.
收到的鲜花
  • ybyc99992015-01-24 14:34 送鲜花  3朵  

能编个毛线衣吗?
2015-01-24 14:02
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:1 
递归的用法和规则搞明白了就好

我不是砖家,要努力成为砖家。
2015-01-24 14:28
ybyc9999
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2015-1-24
收藏
得分:0 
回复 8楼 wmf2014
终于搞明白了,谢谢
2015-01-24 14:33
快速回复:关于自身递归的疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017044 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved