C语言的递归调用解说

<span style="font-family:Arial, Helvetica, sans-serif;">//来自于《C和指针》的案例,感觉非常好。</span>
<span style="font-family: Arial, Helvetica, sans-serif;">void binary_to_ascill(unsigned int val)</span>
{
       unsignedintquotient;
       quotient=val/10;
       if(quotient!=00)
       {
              binary_to_ascill(quotient);
       }
       putchar(val %10 + '0');
}



函数执行:

1.      将参数除以10.

2.      如果quotient的值不是0,调用binary_to_ascill()函数打印quotient当前值的各位数字。

3.      接着打印第一步除法运算的余数。

在第二个步骤里面,我们面临的问题和第一步完全相同,只不过是quotient的值变小了,直至变成0位置。有点类似于上级给下级布置任务一样,一级安排给下一级,本级不管下一级如何去实现。把本级无法完成的任务交给下一级。直到最后一级可以把任务给完成,假设分了 n级,第n级任务的完成也就为n-1级创立了条件,然后直至第一级。

具体执行过程:先要明确所声明的变量是如何存储的,当函数被调用的时候,它的变量空间是创建与运行的堆栈之上的,以前调用函数的变量仍保留在堆栈上,不消失。

 

4267这个值调用递归函数后,当函数开始执行的时候

 

 

Val                           quotient

 

4267                                                   

 

执行除法运算后

4267                                                       426

 

接着if语句判断quotient并不是0,所以对函数执行递归操作,这个函数就第二次被调用,调用之初堆栈内容如下:

426                                                         

4267                                                       426

 

堆栈上面创建了一批新的变量,隐藏了当前那批变量,黑体部分,除非当前这次递归调用返回,否则不可以访问。

再次执行除法操作

426                                                         42

4267                                                       426

但是这个时候quotient还不是0,还是继续执行递归,并且再继续创建一批变量。

执行完这次调用的出发运算后,堆栈内容如下:

 

42                                                           4

426                                                         42

4267                                                       426

再次执行后

 

 

4                                                             0

42                                                           4

426                                                         42

4267                                                       426

 

不算递归调用语句本身,到目前为止所执行的语句都是除法运算和对quotient的值的测试,由于递归调用使这些语句重复执行,类似循环:当quotient0时候,

它的值为初始值重新开始循环,递归调用还是会保存一些信息,就是那些放在堆栈的变量值,这些信息很快就变得很重要,因为putchar()语句需要这些变量来完成操作。

 

现在递归函数不再调用自己,而是开始执行putchar语句,开始打印输出,然后开始函数返回,并且销毁堆栈上的变量值。

 

每次调用putchar得到变量val的最后一个数字,方法就是对val进行模10取余运算,然后在相加与字符常量 0’相加,得到字符本身。

每次执行完后就销毁。

4                                                             0

42                                                           4

426                                                         42

4267                                                       426

 

在栈顶的4   0,符合条件应该输出的是4,输出以后,4所在的被递归调用的函数执行完成了,所以他的变量也就没有了,栈存储的内容也就是

 

42                                                           4

426                                                         42

4267                                                       426

这样按照上次的推理和分析,输出的是2。直到把整个数据全部输出。

 

也就看到了屏幕上输出的这个字符。

大致回顾下,binary_to_ascill对传递来的第一个参数这样要求的。先把这个数

整除10观察是否为0,如果为0,这个书肯定是一位数,第三步输出就一定能实现,整个数的打印,但是如果不是一位数,我就在第二个步骤调用本身,为了不混淆用binary_to_ascill_1表示但是参数变小了,变成了原来的十分之一,为什么第一个函数的变量没有消失,而是保存了,那是因为第一个binary_to_ascill 第三部没有执行,函数还没有运行完,所以变量没消失。binary_to_ascill_1如果不行那就继续在它的第二部调用binary_to_ascill_2.它的变量没有被移除和binary_to_ascill是一样的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值