函数递归调用堆栈分析.doc
《函数递归调用堆栈分析.doc》由会员分享,可在线阅读,更多相关《函数递归调用堆栈分析.doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、函数递归调用堆栈分析这里有一个庞杂的次序,可用于说明递归。次序的目的是把一个整数从二进制方法转换为可打印的字符方法。比如:给出一个值4267,我们需要依次发作字符4,2,6,跟7。就如在printf函数中应用了%d格式码,它就会实行类似处理。我们采用的策略是把那个值反复除以10,并打印各个余数。比如,4267除10的余数是7,但是我们不克不迭开门见山打印那个余数。我们需要打印的是板滞字符汇合表示数字7的值。在ASCII码中,字符7的值是55,因此我们需要在余数上加上48来获得精确的字符,但是,应用字符常量而不是整型常量可以提高次序的可移植性。0的ASCII码是48,因此我们用余数加上0,因此有
2、上面的关系:0+0=00+1=10+2=2.从这些关系中,我们特不随便看出在余数上加上0就可以发作对应字符的代码。接着就打印出余数。下一步再取商的值,4267/10等于426。然后用那个值反复上述步伐。这种处理方法存在的唯一征询题是它发作的数字次序恰恰相反,它们是逆向打印的。因此在我们的次序中应用递归来回头修正那个征询题。我们那个次序中的函数是递归性质的,由于它包含了一个对本身的调用。乍一看,函数大年夜概永世不会进展。当函数调用时,它将调用本身,第2次调用还将调用本身,以此类推,大年夜概永世调用下去。这也是我们在刚接触递归时最想不清晰的情况。但是,理想上并不会出现这种情况。那个次序的递归完成了
3、某种类型的螺旋状while循环。while循环在循环体每次实行时必须获得某种进展,逐步迫近循环进展条件。递归函数也是如此,它在每次递归调用后必须越来越濒临某种限制条件。当递归函数符合那个限制条件时,它便不在调用本身。在次序中,递归函数的限制条件的确是变量quotient为零。在每次递归调用之前,我们都把quotient除以10,因此每递归调用一次,它的值就越来越濒临零。当它最终变成零时,递归便告进展。/*接受一个整型值无标志0,把它转换为字符并打印它,前导零被删除*/#includeintbinary_to_ascii(unsignedintvalue)unsignedintquotient;
4、quotient=value/10;if(quotient!=0)binary_to_ascii(quotient);putchar(value%10+0);递归是怎么样帮助我们以精确的次序打印这些字符呢?上面是那个函数的任务流程。1.将参数值除以102.假定quotient的值为非零,调用binary-to-ascii打印quotient当前值的各位数字3.接着,打印步伐1中除法运算的余数留心在第2个步伐中,我们需要打印的是quotient当前值的各位数字。我们所面临的征询题跟最初的征询题完好一样,只是变量quotient的值变小了。我们用刚编写的函数把整数转换为各个数字字符并打印出来来处理
5、那个征询题。由于quotient的值越来越小,因此递归最终会进展。一旦你理解了递归,阅读递归函数最随便的方法不是于它的实行过程,而是相信递归函数会顺利完成它的任务。假定你的每个步伐精确无误,你的限制条件设置精确,同时每次调用之后更濒临限制条件,递归函数总是能精确的完成任务。但是,为了理解递归的任务情理,你需要追踪递归调用的实行过程,因此让我们来进展这项任务。追踪一个递归函数的实行过程的关键是理解函数中所声明的变量是怎么样存储的。当函数被调用时,它的变量的空间是创建于运行时堆栈上的。平常调用的函数的变量扔保存在堆栈上,但他们被新函数的变量所粉饰,因此是不克不迭被访征询的。当递归函数调用本身时,情
6、况因此如此。每进展一次新的调用,都将创建一批变量,他们将粉饰递归函数前一次调用所创建的变量。当我追踪一个递归函数的实行过程时,必须把分差异次调用的变量区分开来,以避免混淆。次序中的函数有两个变量:参数value跟局部变量quotient。上面的一些图表示了堆栈的形状,当前可以访征询的变量位于栈顶。所有其他调用的变量饰以灰色的阴影,表示他们不克不迭被当前正在实行的函数访征询。假定我们以4267那个值调用递归函数。当函数刚开始实行时,堆栈的内容如以以下图所示:实行除法之后,堆栈的内容如下:接着,if语句揣摸出quotient的值非零,因此对该函数实行递归调用。当那个函数第二次被调用之初,堆栈的内容
7、如下:堆栈上创建了一批新的变量,隐藏了后面的那批变量,除非当前此次递归调用前去,否那么他们是不克不迭被访征询的。再次实行除法运算之后,堆栈的内容如下:quotient的值现在为42,仍然非零,因此需要接着实行递归调用,并再创建一批变量。在实行完此次调用的出发运算之后,堆栈的内容如下:现在,quotient的值仍然非零,仍然需要实行递归调用。在实行除法运算之后,堆栈的内容如下:不算递归调用语句本身,到现在为止所实行的语句只是除法运算以及对quotient的值进展测试。由于递归调用这些语句反复实行,因此它的结果类似循环:当quotient的值非零时,把它的值作为初始值重新开始循环。但是,递归调用将
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 递归 调用 堆栈 分析
限制150内