y623704481 发表于 2015-11-13 11:16:26

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

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

y623704481 发表于 2015-11-16 12:44:59

这是关于这个问题本人的一些理解,不对之处请指正。。。原文在附件

y623704481 发表于 2015-11-13 11:17:21

希望高手来解答一下,用C玩51,感觉连C都没学好。。。

专注XXOO三十年 发表于 2015-11-13 11:35:16

共执行了四次

日日♂夜夜 发表于 2015-11-13 11:41:27

9 4 3 2 1 ?

laujc 发表于 2015-11-13 12:02:22

专注XXOO三十年 发表于 2015-11-13 11:35
共执行了四次

5次呀,main里还有一个{:titter:}

rain73 发表于 2015-11-13 12:16:16

干嘛要搞成递规?

专注XXOO三十年 发表于 2015-11-13 12:29:05

laujc 发表于 2015-11-13 12:02
5次呀,main里还有一个

大家来讨论一下,binary_to_ascii这个子函数中,putchar执行了多少次?
要看楼主问的问题进行回答。。。
不认真看题,扣10分。

y623704481 发表于 2015-11-13 12:41:35

专注XXOO三十年 发表于 2015-11-13 11:35
共执行了四次

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

y623704481 发表于 2015-11-13 12:42:27

laujc 发表于 2015-11-13 12:02
5次呀,main里还有一个

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

y623704481 发表于 2015-11-13 12:43:13

日日♂夜夜 发表于 2015-11-13 11:41
9 4 3 2 1 ?

6 4321,能告诉为什么吗?

y623704481 发表于 2015-11-13 12:45:41

本帖最后由 y623704481 于 2015-11-13 13:26 编辑

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

专注XXOO三十年 发表于 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,就没调用。

y623704481 发表于 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出来!!!!

y623704481 发表于 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 ...

诶,谢了,懂了

laujc 发表于 2015-11-13 13:39:30

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

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

ywhbn 发表于 2015-11-13 14:31:27

最好改成while,简单明了省开销

lcw_swust 发表于 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

专注XXOO三十年 发表于 2015-11-13 15:13:53

lcw_swust 发表于 2015-11-13 14:35
这四个数应该是4321,432,43,4

你说得对!赞

y623704481 发表于 2015-11-13 15:38:03

lcw_swust 发表于 2015-11-13 14:35
这四个数应该是4321,432,43,4

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

逍遥的迎运 发表于 2015-11-13 16:06:15

个人感觉是这样的,楼主程序编写有问题,子函数中if只是个判断语句,判断完了执行了puchar语句,而你子函数中没有设置控制函数运行终止的语句,C语言自动就在子函数中循环执行,直到你的if判断为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');
       
}

逍遥的迎运 发表于 2015-11-13 16:20:27

哦,不对,想错了,忘记看题目了,你每次调用一次自己都要输出一次puchar啊,这没办法···干嘛用递归啊

xiaobendan 发表于 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

acmilannast 发表于 2015-11-13 16:59:05

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

每次调用都会生成一个零食的value{:lol:}

xiaobendan 发表于 2015-11-13 17:11:44

acmilannast 发表于 2015-11-13 16:59
每次调用都会生成一个零食的value

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

wxty 发表于 2015-11-13 17:38:28

你们城里人太会玩了,单片机资源够吗?

yick 发表于 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 ...

你说的对~~~

acmilannast 发表于 2015-11-13 21:03:12

xiaobendan 发表于 2015-11-13 17:11
是啊,但是最后连续执行4次的PUTCHAR并没有获得前边3次产生的零食的VALUE啊

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

DevLabs 发表于 2015-11-13 21:22:45

执行了4次.
if之后生成一个新的栈帧, 再次执行binary_to_ascii(), 一直到条件不成立, 最里面一层调用返回, 执行第一次putchar(), 然后再返回再执行putchar()直到最外面一层返回.

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

zhangpisces 发表于 2015-11-13 21:41:22

专注XXOO三十年 发表于 2015-11-13 15:13
你说得对!赞

我怎么觉得是 4 43 432 4321{:lol:}

xiaobendan 发表于 2015-11-14 07:36:06

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

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

29楼说的对

xiaobendan 发表于 2015-11-14 07:40:05

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

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

DevLabs 发表于 2015-11-14 10:38:58

xiaobendan 发表于 2015-11-14 07:40
VOID MAIN()是错误的,怎样才对呢?
我知道不加VOID的话,KEIL会提示没有返回值的错误,不过里面只要有 ...

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

xivisi 发表于 2015-11-15 11:09:22

楼主把代码搞到VC里单步总行了吧?

y623704481 发表于 2015-11-16 12:48:47

xiaobendan 发表于 2015-11-14 07:36
只是函数自身获得了零食的VALUE,但是每次递归之前,并没有执行PUTCHAR,二是4次递归之后又连续执行了4次 ...

是4321。。。。

xiaobendan 发表于 2015-11-16 13:14:41

y623704481 发表于 2015-11-16 12:48
是4321。。。。

是经过验证的吗?验证的程序是楼主位的程序吗?很奇怪,莫非不是用C51验证的?
页: [1]
查看完整版本: 关于C语言递归的一个问题讨论