- 1、本文档共116页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章栈和队列
long Factorial ( long n ) { int temp; if ( n == 0 ) return 1; else temp = n * Factorial (n-1); RetLoc2 return temp; } void main ( ) { int n; n = Factorial (4); RetLoc1 } * 计算Fact时活动记录的内容 递归调用序列 0 RetLoc2 1 RetLoc2 2 RetLoc2 3 RetLoc2 4 RetLoc1 参数 返回地址 返回时的指令 RetLoc1 return 4*6 //返回24 RetLoc2 return 3*2 //返回6 RetLoc2 return 1 //返回1 RetLoc2 return 1*1 //返回1 RetLoc2 return 2*1 //返回2 * 递归过程改为非递归过程 递归过程简洁、易编、易懂 递归过程效率低,重复计算多 改为非递归过程的目的是提高效率 单向递归和尾递归可直接用迭代实现其非递归过程 其他情形必须借助栈实现非递归过程 * 计算斐波那契数列的函数Fib(n)的定义 求解斐波那契数列的递归算法 long Fib ( long n ) { if ( n = 1 ) return n; else return Fib (n-1) + Fib (n-2); } 如 F0 = 0, F1 = 1, F2 = 1, F3 = 2, F4 = 3, F5 = 5 * 斐波那契数列的递归调用树 Fib(1) Fib(0) Fib(1) Fib(2) Fib(3) Fib(4) Fib(1) Fib(0) Fib(2) Fib(1) Fib(0) Fib(1) Fib(2) Fib(3) Fib(5) * Fib(1) Fib(0) Fib(2) Fib(1) Fib(0) Fib(2) Fib(1) Fib(3) Fib(4) ? ? ? ? ? ? ? ? ? 栈结点 n tag tag = 1, 向左递归;tag = 2, 向右递归 * Fib(1) Fib(0) Fib(2) Fib(1) Fib(0) Fib(2) Fib(1) Fib(3) Fib(4) ? ? ? ? ? ? ? ? ? 2 1 3 1 4 1 n=1 sum=0+1 2 2 3 1 4 1 n=2-2 3 1 4 1 n=0 sum=1+0 3 2 4 1 n=3-2 ? ? ? ? 4 1 n=1 sum=1+1 4 2 ? n=4-2 ? ? ? ? ? ? ? ? ? ? ? ? ? * Fib(1) Fib(0) Fib(2) Fib(1) Fib(0) Fib(2) Fib(1) Fib(3) Fib(4) ? ? ? ? ? ? ? ? ? 2 1 4 2 n=1 sum=2+1 2 2 4 2 n=2-2 4 2 n=0 sum=3+0 ? ? ? ? ? ? ? ? * long Fibnacci ( long n ) { StackNode S; Node *w; long sum = 0; //反复执行直到所有终端结点数据累加完 do { while ( n 1 ) { w-n = n; w-tag = 1; S.push ( w ); n--; } //向左递归到底, 边走边进栈 sum = sum + n; //执行求和 * while ( !S.IsEmpty( ) ) { w = S.getTop( ); S.Pop( ); if ( w-tag == 1 ) { //改为向右递归 w-tag = 2; S.push ( w ); n = w-n – 2; //F(n)右侧为F(n-2)
文档评论(0)