搜索
bottom↓
回复: 36

关于C语言递归的一个问题讨论

[复制链接]

出0入0汤圆

发表于 2015-11-13 11:16:26 | 显示全部楼层 |阅读模式
大家来讨论一下,binary_to_ascii这个子函数中,putchar执行了多少次?

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2015-11-16 12:44:59 | 显示全部楼层
这是关于这个问题本人的一些理解,不对之处请指正。。。原文在附件

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2015-11-13 11:17:21 | 显示全部楼层
希望高手来解答一下,用C玩51,感觉连C都没学好。。。

出0入0汤圆

发表于 2015-11-13 11:35:16 | 显示全部楼层
共执行了四次

出0入0汤圆

发表于 2015-11-13 11:41:27 | 显示全部楼层
9 4 3 2 1 ?

出0入4汤圆

发表于 2015-11-13 12:02:22 | 显示全部楼层

5次呀,main里还有一个

出0入0汤圆

发表于 2015-11-13 12:16:16 | 显示全部楼层
干嘛要搞成递规?

出0入0汤圆

发表于 2015-11-13 12:29:05 | 显示全部楼层
laujc 发表于 2015-11-13 12:02
5次呀,main里还有一个

大家来讨论一下,binary_to_ascii这个子函数中,putchar执行了多少次?

要看楼主问的问题进行回答。。。
不认真看题,扣10分。

出0入0汤圆

 楼主| 发表于 2015-11-13 12:41:35 | 显示全部楼层

真的是超级厉害,我想问的是子函数里面的putchar没有循环,为什么执行的是4次!!!非常感谢

出0入0汤圆

 楼主| 发表于 2015-11-13 12:42:27 | 显示全部楼层
laujc 发表于 2015-11-13 12:02
5次呀,main里还有一个

为什么是四次???大神求解惑,阿莫里面的人才真的好多。。。

出0入0汤圆

 楼主| 发表于 2015-11-13 12:43:13 | 显示全部楼层

6 4321,能告诉为什么吗?

出0入0汤圆

 楼主| 发表于 2015-11-13 12:45:41 | 显示全部楼层
本帖最后由 y623704481 于 2015-11-13 13:26 编辑

不好意思,看错了。。。。此楼忽略

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-11-13 12:49:19 | 显示全部楼层
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
binay_to_ascii(321);
binay_to_ascii(21);
binay_to_ascii(1);
在最后一次判断的时候,参数为0,就没调用。

出0入0汤圆

 楼主| 发表于 2015-11-13 12:54:26 | 显示全部楼层
专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...

if条件判断之后就直接调用binary_to_ascii,后面的putchar函数难道还会调用吗?感觉你这样子解释有点牵强,我还贴了一段代码,很神奇的是,putchar没有打印出4321出来!!!!

出0入0汤圆

 楼主| 发表于 2015-11-13 13:30:35 | 显示全部楼层
专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...

诶,谢了,懂了

出0入4汤圆

发表于 2015-11-13 13:39:30 | 显示全部楼层
y623704481 发表于 2015-11-13 12:54
if条件判断之后就直接调用binary_to_ascii,后面的putchar函数难道还会调用吗?感觉你这样子解释有点牵强 ...

if条件判断之后,会执行putchar函数的。有调用时就等调用返回后执行。

出0入0汤圆

发表于 2015-11-13 14:31:27 | 显示全部楼层
最好改成while,简单明了省开销

出0入0汤圆

发表于 2015-11-13 14:35:19 | 显示全部楼层
专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...

这四个数应该是4321,432,43,4

出0入0汤圆

发表于 2015-11-13 15:13:53 | 显示全部楼层
lcw_swust 发表于 2015-11-13 14:35
这四个数应该是4321,432,43,4

你说得对!赞

出0入0汤圆

 楼主| 发表于 2015-11-13 15:38:03 | 显示全部楼层
lcw_swust 发表于 2015-11-13 14:35
这四个数应该是4321,432,43,4

确实,正解,不过要详细讨论,还有堆栈的问题。。。

出0入0汤圆

发表于 2015-11-13 16:06:15 | 显示全部楼层
个人感觉是这样的,楼主程序编写有问题,子函数中if只是个判断语句,判断完了执行了puchar语句,而你子函数中没有设置控制函数运行终止的语句,C语言自动就在子函数中循环执行,直到你的if判断为0;程序不再执行下去。

出0入0汤圆

发表于 2015-11-13 16:11:56 | 显示全部楼层
void binary_to_ascii(unsigned int value)
{
        while(1)
        {
                unsigned int quotient;
                quotient =value/10;
                if(quotient != 0)
                        binary_to_ascii(quotient);
        }
        puchar(value%10 + '0');
       
}

出0入0汤圆

发表于 2015-11-13 16:20:27 | 显示全部楼层
哦,不对,想错了,忘记看题目了,你每次调用一次自己都要输出一次puchar啊,这没办法···干嘛用递归啊

出0入0汤圆

发表于 2015-11-13 16:48:52 | 显示全部楼层
y623704481 发表于 2015-11-13 15:38
确实,正解,不过要详细讨论,还有堆栈的问题。。。

你确定这个是对的吗
我觉得是PUTCHAR虽然是被执行了4次,但是实际上输出的是4个4,而不是4321,432,43,4
因为递归调用了4次后虽然每次调用后的结果是/10的,但是实际上每次调用后都没有执行PUTCHAR,而是在调用完成了4次后才连续执行了4次PUTCHAR,而此时VALUE的值一直都是4

出0入4汤圆

发表于 2015-11-13 16:59:05 | 显示全部楼层
xiaobendan 发表于 2015-11-13 16:48
你确定这个是对的吗
我觉得是PUTCHAR虽然是被执行了4次,但是实际上输出的是4个4,而不是4321,432,43,4
...

每次调用都会生成一个零食的value  

出0入0汤圆

发表于 2015-11-13 17:11:44 | 显示全部楼层
acmilannast 发表于 2015-11-13 16:59
每次调用都会生成一个零食的value

是啊,但是最后连续执行4次的PUTCHAR并没有获得前边3次产生的零食的VALUE啊

出0入0汤圆

发表于 2015-11-13 17:38:28 | 显示全部楼层
你们城里人太会玩了,单片机资源够吗?

出0入0汤圆

发表于 2015-11-13 20:41:44 | 显示全部楼层
专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...

你说的对~~~

出0入4汤圆

发表于 2015-11-13 21:03:12 | 显示全部楼层
xiaobendan 发表于 2015-11-13 17:11
是啊,但是最后连续执行4次的PUTCHAR并没有获得前边3次产生的零食的VALUE啊

既然每次都获取的是自己的临时变量  为什么会没有获取到? 就当两个语句之间就调用了一个函数一样,无非现在调用的又是这个函数,但是不影响结果

出0入0汤圆

发表于 2015-11-13 21:22:45 | 显示全部楼层
执行了4次.
if之后生成一个新的栈帧, 再次执行binary_to_ascii(), 一直到条件不成立, 最里面一层调用返回, 执行第一次putchar(), 然后再返回再执行putchar()直到最外面一层返回.

另外两点:
1, 递归在资源紧张时容易爆栈, 会引发程序异常.
2, void main()这种写法是错误的.

出0入0汤圆

发表于 2015-11-13 21:41:22 | 显示全部楼层

我怎么觉得是 4 43 432 4321

出0入0汤圆

发表于 2015-11-14 07:36:06 | 显示全部楼层
acmilannast 发表于 2015-11-13 21:03
既然每次都获取的是自己的临时变量  为什么会没有获取到? 就当两个语句之间就调用了一个函数一样,无非 ...

只是函数自身获得了零食的VALUE,但是每次递归之前,并没有执行PUTCHAR,二是4次递归之后又连续执行了4次PUTCHAR所以输出是4个4

29楼说的对

出0入0汤圆

发表于 2015-11-14 07:40:05 | 显示全部楼层
DevLabs 发表于 2015-11-13 21:22
执行了4次.
if之后生成一个新的栈帧, 再次执行binary_to_ascii(), 一直到条件不成立, 最里面一层调用返回,  ...

VOID MAIN()是错误的,怎样才对呢?
我知道不加VOID的话,KEIL会提示没有返回值的错误,不过里面只要有WHILE(1)的主体循环,也没有错误报警。不过一般还是选择加上的。

出0入0汤圆

发表于 2015-11-14 10:38:58 来自手机 | 显示全部楼层
xiaobendan 发表于 2015-11-14 07:40
VOID MAIN()是错误的,怎样才对呢?
我知道不加VOID的话,KEIL会提示没有返回值的错误,不过里面只要有 ...

C99规定了main()函数的返回值是int型,所以写void main()不符合标准 :)

出0入0汤圆

发表于 2015-11-15 11:09:22 | 显示全部楼层
楼主  把代码搞到VC里  单步总行了吧?

出0入0汤圆

 楼主| 发表于 2015-11-16 12:48:47 | 显示全部楼层
xiaobendan 发表于 2015-11-14 07:36
只是函数自身获得了零食的VALUE,但是每次递归之前,并没有执行PUTCHAR,二是4次递归之后又连续执行了4次 ...

是4321。。。。

出0入0汤圆

发表于 2015-11-16 13:14:41 | 显示全部楼层

是经过验证的吗?验证的程序是楼主位的程序吗?很奇怪,莫非不是用C51验证的?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-5 15:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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