关于C语言递归的一个问题讨论
大家来讨论一下,binary_to_ascii这个子函数中,putchar执行了多少次? 这是关于这个问题本人的一些理解,不对之处请指正。。。原文在附件希望高手来解答一下,用C玩51,感觉连C都没学好。。。 共执行了四次 9 4 3 2 1 ? 专注XXOO三十年 发表于 2015-11-13 11:35
共执行了四次
5次呀,main里还有一个{:titter:} 干嘛要搞成递规? laujc 发表于 2015-11-13 12:02
5次呀,main里还有一个
大家来讨论一下,binary_to_ascii这个子函数中,putchar执行了多少次?
要看楼主问的问题进行回答。。。
不认真看题,扣10分。 专注XXOO三十年 发表于 2015-11-13 11:35
共执行了四次
真的是超级厉害,我想问的是子函数里面的putchar没有循环,为什么执行的是4次!!!非常感谢 laujc 发表于 2015-11-13 12:02
5次呀,main里还有一个
为什么是四次???大神求解惑,阿莫里面的人才真的好多。。。 日日♂夜夜 发表于 2015-11-13 11:41
9 4 3 2 1 ?
6 4321,能告诉为什么吗? 本帖最后由 y623704481 于 2015-11-13 13:26 编辑
不好意思,看错了。。。。此楼忽略 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,就没调用。 专注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出来!!!! 专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...
诶,谢了,懂了 y623704481 发表于 2015-11-13 12:54
if条件判断之后就直接调用binary_to_ascii,后面的putchar函数难道还会调用吗?感觉你这样子解释有点牵强 ...
if条件判断之后,会执行putchar函数的。有调用时就等调用返回后执行。 最好改成while,简单明了省开销 专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...
这四个数应该是4321,432,43,4 lcw_swust 发表于 2015-11-13 14:35
这四个数应该是4321,432,43,4
你说得对!赞 lcw_swust 发表于 2015-11-13 14:35
这四个数应该是4321,432,43,4
确实,正解,不过要详细讨论,还有堆栈的问题。。。 个人感觉是这样的,楼主程序编写有问题,子函数中if只是个判断语句,判断完了执行了puchar语句,而你子函数中没有设置控制函数运行终止的语句,C语言自动就在子函数中循环执行,直到你的if判断为0;程序不再执行下去。 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');
} 哦,不对,想错了,忘记看题目了,你每次调用一次自己都要输出一次puchar啊,这没办法···干嘛用递归啊 y623704481 发表于 2015-11-13 15:38
确实,正解,不过要详细讨论,还有堆栈的问题。。。
你确定这个是对的吗
我觉得是PUTCHAR虽然是被执行了4次,但是实际上输出的是4个4,而不是4321,432,43,4
因为递归调用了4次后虽然每次调用后的结果是/10的,但是实际上每次调用后都没有执行PUTCHAR,而是在调用完成了4次后才连续执行了4次PUTCHAR,而此时VALUE的值一直都是4 xiaobendan 发表于 2015-11-13 16:48
你确定这个是对的吗
我觉得是PUTCHAR虽然是被执行了4次,但是实际上输出的是4个4,而不是4321,432,43,4
...
每次调用都会生成一个零食的value{:lol:} acmilannast 发表于 2015-11-13 16:59
每次调用都会生成一个零食的value
是啊,但是最后连续执行4次的PUTCHAR并没有获得前边3次产生的零食的VALUE啊 你们城里人太会玩了,单片机资源够吗? 专注XXOO三十年 发表于 2015-11-13 12:49
binay_to_ascii调用一次,则执行一次putchar,binay_to_ascii共执行了4次,分别是
binay_to_ascii(4321);
b ...
你说的对~~~ xiaobendan 发表于 2015-11-13 17:11
是啊,但是最后连续执行4次的PUTCHAR并没有获得前边3次产生的零食的VALUE啊
既然每次都获取的是自己的临时变量为什么会没有获取到? 就当两个语句之间就调用了一个函数一样,无非现在调用的又是这个函数,但是不影响结果 执行了4次.
if之后生成一个新的栈帧, 再次执行binary_to_ascii(), 一直到条件不成立, 最里面一层调用返回, 执行第一次putchar(), 然后再返回再执行putchar()直到最外面一层返回.
另外两点:
1, 递归在资源紧张时容易爆栈, 会引发程序异常.
2, void main()这种写法是错误的. 专注XXOO三十年 发表于 2015-11-13 15:13
你说得对!赞
我怎么觉得是 4 43 432 4321{:lol:} acmilannast 发表于 2015-11-13 21:03
既然每次都获取的是自己的临时变量为什么会没有获取到? 就当两个语句之间就调用了一个函数一样,无非 ...
只是函数自身获得了零食的VALUE,但是每次递归之前,并没有执行PUTCHAR,二是4次递归之后又连续执行了4次PUTCHAR所以输出是4个4
29楼说的对
DevLabs 发表于 2015-11-13 21:22
执行了4次.
if之后生成一个新的栈帧, 再次执行binary_to_ascii(), 一直到条件不成立, 最里面一层调用返回,...
VOID MAIN()是错误的,怎样才对呢?
我知道不加VOID的话,KEIL会提示没有返回值的错误,不过里面只要有WHILE(1)的主体循环,也没有错误报警。不过一般还是选择加上的。
xiaobendan 发表于 2015-11-14 07:40
VOID MAIN()是错误的,怎样才对呢?
我知道不加VOID的话,KEIL会提示没有返回值的错误,不过里面只要有 ...
C99规定了main()函数的返回值是int型,所以写void main()不符合标准 :) 楼主把代码搞到VC里单步总行了吧? xiaobendan 发表于 2015-11-14 07:36
只是函数自身获得了零食的VALUE,但是每次递归之前,并没有执行PUTCHAR,二是4次递归之后又连续执行了4次 ...
是4321。。。。 y623704481 发表于 2015-11-16 12:48
是4321。。。。
是经过验证的吗?验证的程序是楼主位的程序吗?很奇怪,莫非不是用C51验证的?
页:
[1]