理解递归的工作原理 怎么理解递归
为了理解递归的工作原理,你需要追踪递归调用的执行过程,所以让我们来进行这项工作。追踪一个递归函数的执行过程的关键是理解函数中所声明的变量是如何存储的。当函数被调用时,它的变量的空间是创建于运行时堆栈上的。以前调用的函数的变量扔保留在堆栈上,但他们被新函数的变量所掩盖,因此是不能被访问的。
当递归函数调用自身时,情况于是如此。每进行一次新的调用,都将创建一批变量,他们将掩盖递归函数前一次调用所创建的变量。当我追踪一个递归函数的执行过程时,必须把分数不同次调用的变量区分开来,以避免混淆。
程序中的函数有两个变量:参数value和局部变量quotient。下面的一些图显示了堆栈的状态,当前可以访问的变量位于栈顶。所有其他调用的变量饰以灰色的阴影,表示他们不能被当前正在执行的函数访问。
假定我们以4267这个值调用递归函数。当函数刚开始执行时,堆栈的内容如下图所示:
执行除法之后,堆栈的内容如下:
接着,if语句判断出quotient的值非零,所以对该函数执行递归调用。当这个函数第二次被调用之初,堆栈的内容如下:
堆栈上创建了一批新的变量,隐藏了前面的那批变量,除非当前这次递归调用返回,否则他们是不能被访问的。再次执行除法运算之后,堆栈的内容如下:
quotient的值现在为42,仍然非零,所以需要继续执行递归调用,并再创建一批变量。在执行完这次调用的出发运算之后,堆栈的内容如下:
此时,quotient的值还是非零,仍然需要执行递归调用。在执行除法运算之后,堆栈的内容如下:
不算递归调用语句本身,到目前为止所执行的语句只是除法运算以及对quotient的值进行测试。由于递归调用这些语句重复执行,所以它的效果类似循环:当quotient的值非零时,把它的值作为初始值重新开始循环。但是,递归调用将会保存一些信息(这点与循环不同),也就好是保存在堆栈中的变量值。这些信息很快就会变得非常重要。
现在quotient的值变成了零,递归函数便不再调用自身,而是开始打印输出。然后函数返回,并开始销毁堆栈上的变量值。
每次调用putchar得到变量value的最后一个数字,方法是对value进行模10取余运算,其结果是一个0到9之间的整数。把它与字符常量‘0’相加,其结果便是对应于这个数字的ASCII字符,然后把这个字符打印出来。
输出4:
接着函数返回,它的变量从堆栈中销毁。接着,递归函数的前一次调用重新继续执行,她所使用的是自己的变量,他们现在位于堆栈的顶部。因为它的value值是42,所以调用putchar后打印出来的数字是2。
输出42:
接着递归函数的这次调用也返回,它的变量也被销毁,此时位于堆栈顶部的是递归函数再前一次调用的变量。递归调用从这个位置继续执行,这次打印的数字是6。在这次调用返回之前,堆栈的内容如下:
输出426:
现在我们已经展开了整个递归过程,并回到该函数最初的调用。这次调用打印出数字7,也就是它的value参数除10的余数。
输出4267:
然后,这个递归函数就彻底返回到其他函数调用它的地点。
如果你把打印出来的字符一个接一个排在一起,出现在打印机或屏幕上,你将看到正确的值:4267
更多阅读
小天鹅干洗机的工作原理解说 干洗机的原理
我们把采用四氯乙烯作为洗涤溶剂的干洗设备称为四氯乙烯干洗机,对采用石油作为溶剂的干洗设备称为石油干洗机;环保型干洗机是指在运行全过程中符合环保要求,对环境的危害没有或低于国家标准要求。小天鹅干洗机根据以下可能对环境和人
电力猫的工作原理 tplink电力猫说明书
相信大家已经对电力线上网不会感到陌生了。“随便一个插座,你就可以上网”这就是电力宽带所描述的前景,不过就目前来说,此种上网方式还 并未普及开来,除了其采用的设备价格较高外,技术问题也是影响其发展的瓶颈。不过任何新生技术的普及
55度杯子的工作原理 55摄氏度杯子原理
55度杯子的工作原理——简介最近网上出现了一个55度杯子,此款杯子有“快速降温”和“快速升温”的功能,将100摄氏度的开水倒入杯中,摇一摇(约1分钟),就可以快速降温至人体可饮用的55度温水。同样,将冷水倒入杯中,摇一摇 (约1分钟),就可以快速升
蒸汽发生器的工作原理 电蒸汽发生器厂家
? ? ?因为蒸汽发生器和常规的锅炉不一样,因为它不需要年检,所以最近有很多的用户问我蒸汽发生器的原理,蒸汽发生器是怎么工作的,今天就由我给大家分析一下蒸汽发生器的工作原理蒸汽发生器在水汽系统方面,给水在加热器中加热到一定温度,经
搜索引擎神秘的工作原理 目录搜索引擎工作原理
了解搜索引擎的工作原理对我们日常搜索应用和网站提交推广都会有很大帮助。■ 全文搜索引擎在搜索引擎分类部分我们提到过全文搜索引擎从网站提取信息建立网页数据库的概念。搜索引擎的自动信息搜集功能分两种。一种是定期搜索,即每