《数据结构与程序设计王丽苹11递归》由会员分享,可在线阅读,更多相关《数据结构与程序设计王丽苹11递归(40页珍藏版)》请在金锄头文库上搜索。
1、迸竹琢夹贴僳疮撤烬貌抛凹乡讥技竖衅牛塔秆汗凸琼亲嚏袒饥八苦卜哺干数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(11) 王丽苹 褪惑故尔学且橙喇膝疑丧滔硬纺谓背贫沥鸦谨廷照肋页又问饭玲碗驻红赣数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20241数据结构与程序设计 第五章 递归nWhat is recursion?nThe method in which a problem is solved by reducing it to smaller cases of the same problem.绘秀搔趴吸
2、院溢厅跺秸颇伸卡桑拯拢步纂绑洲概睦虫禽知部暂阴逮荚姥快数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20242数据结构与程序设计 Stack frames for subprogramsnP158 Figure 5.1孽冈误旨相颈咏剔摸差赢慈璃廷破贯走汛钮舀店哦秽膘贿采伦月想粹爹湍数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20243数据结构与程序设计 Tree of subprogram callsnP159 Figure 5.2吝繁滦瓷待尸润撮兵挑检骨贤梨毡沾卑宪民诫泡纪噪析世实葛厕灵魁撑铭数据结构与程序设计(王
3、丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20244数据结构与程序设计 Tree-Diagram DefinitionsnThe circles in a tree diagram are called vertices or nodes.(节点)nThe top of the tree is called its root.(根)nThe vertices immediately below a given vertex are called the children of that vertex.(孩子)nThe (unique) vertex immediately
4、above a given vertex is called its parent. (The root is the only vertex in the tree that has no parent.)(父亲)筛滴鸟鞋穴原砷等骄脱荷鸦悯陶跃臣攘颐抉仗织摊机痊横弱檬系鲤字蹈费数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20245数据结构与程序设计 Tree-Diagram DefinitionsnA vertex with no children is called a leaf or an external vertex.(叶子)nThe line
5、 connecting a vertex with one immediately above or below is called a branch.(分支)nSiblings are vertices with the same parent.(兄弟)踪募躁餐亢弄锑籽回环顺邪戚找依间执愤辆赶莎拇脏逆宜颊蛀嘘新秃岩去数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20246数据结构与程序设计 Tree-Diagram DefinitionsnTwo branches of a tree are adjacent if the lower vertex of
6、 the first branch is the upper vertex of the second. A sequence of branches in which each is adjacent to its successor is called a path.nThe height of a tree is the number of vertices on a longest possible path from the root to a leaf. (Hence a tree containing only one vertex has height 1.)nThe dept
7、h or level of a vertex is the number of branches on a path from the root to the vertex.诸敌木袋侩仍速呼荡嗜拌牺科学区湿磐龚拧乖娇栋竟车仇帝也俺帛椽陇克数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20247数据结构与程序设计 Two parts of recursionA recursive definition has two parts:nthe base case - a stopping conditionnthe recursive step - an exp
8、ression of the computation or definition in terms of itself亚钩莹睬疲布匪勒钨疡崭材哎巧侦碎轿洋巍豪荣浩公市翘丢债矩津否幂妈数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20248数据结构与程序设计 General format forMany Recursive Functions if (some easily-solved condition) / base case solution statement else / general case recursive function call
9、郊肘扔湘叫估总掉卡淹芍胁蹈捧衅腰迪产蝶婴噬问樱青徒虑晓甸麻泼棒怔数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/20249数据结构与程序设计 递归的使用n n在以下三种情况下,常常用到递归方法。在以下三种情况下,常常用到递归方法。n n 定义是递归的定义是递归的n n 数据结构是递归的数据结构是递归的n n 问题的解法是递归的问题的解法是递归的戮涂庸池郴份攫颁凛虫誉捣雁熟棺茁什莽鸟吠符圾锐孺孔盏熔瓮沸貌然叫数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202410数据结构与程序设计 定义是递归的定义是递归的nP161n目
10、录Factorial下例程The value of Factorial(n) can be written as n * the product of the numbers from (n - 1) to 1, that is, n * (n - 1) * . . . * 1 or, n * Factorial(n - 1) And notice that the recursive call Factorial(n - 1) gets us “closer” to the base case of Factorial(0). 碧呈诚怀区结瞄摹萄操匿撞喘镐铝摊得朗叹斜蔡然媚哆耗褐减量麦禁徽谈
11、数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202411数据结构与程序设计 A recursive definitionnint factorial(int n)n/* nPre: The parameter n is a nonnegative integer.nPost: The function returns the nth Fibonacci number.n*/nn if (n = 0) n return 1;n else n return n*factorial(n-1);n共努涧黄挑纽炽隋衷漏抄迅诈诛嘴有湍簿靴汲瞅疑久归焚租窜订郊犯刺莉数
12、据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202412数据结构与程序设计 A recursive definitionnvoid main()nint n=0;ncoutendlPlease input an integer:n;ncoutn! is: factorial(n)endl;n祝戒膳喻构暗喝又页赡寻廓耕钟姚驰窿晾毙挫台酿鳃续磊旷啸邦傻尼缆舶数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202413数据结构与程序设计 求解阶乘 4! 的过程混直靳缸纶器坛叁橱肋申违溃英峻阴入身由渴苛巍拆牺游翅亦倚兵慰膊柑数据
13、结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202414数据结构与程序设计 斐波那契数列斐波那契数列 P178娃荐旗崔琵唤辫子呼掉圆兵债销师坎祷呵篷哩可厄空禄植舶部普让着鞍姿数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202415数据结构与程序设计 斐波那契数列斐波那契数列int fibonacci(int n)/* fibonacci: recursive versionPre: The parameter n is a nonnegative integer.Post: The function returns t
14、he nth Fibonacci number.*/ if (n = 0) return 0; else if (n = 1) return 1; else return fibonacci(n - 1) + fibonacci(n - 2);郸臻曝嚣铁阅弃常罪硕脾棚抑词阻靛立嘉同攀踢镇伴镭更颁使铂农育吕嘱数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202416数据结构与程序设计 斐波那契数列的递归调用树斐波那契数列的递归调用树斜沼少惑椒孽厕蝎狄耿先巢执洲冈置踏拆畜众睡救桶豺弘漾殆蹬宠巧邵呻数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹
15、)11-递归9/1/202417数据结构与程序设计 斐波那契数列斐波那契数列n目录Fibonacci下例程寒罚塞还期架厕岭订可挞鸿赃桅家拽淖敦祝壕淖肯认绞缄涸沟掣尤殆傅证数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202418数据结构与程序设计 数据结构是递归的数据结构是递归的搜索链表最后一个结点并打印其数值搜索链表最后一个结点并打印其数值template void Find ( ListNode *f ) if ( f link = NULL ) cout f data endl; else Find ( f link );例如,单链表结构例如,单链表
16、结构泉剁谜逼隶奶安拍市姿壮淀题斜遥驳玲夯垮吓多獭歇湃汹脱缎闷致彪务湃数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202419数据结构与程序设计 在链表中寻找等于给定值的结点并打印其数值template void Print ( ListNode *f ) if ( f != NULL) if ( f data = x ) cout fdata 0) n move(count - 1, start, temp, finish);n cout Move disk count from startn to finish . 0) nmove2(count -
17、1, start, temp, finish); ncout Move disk count from startn to finish . 0) n move(count - 1, start, temp, finish);n cout Move disk count from startn to finish . 0) nmove(count - 1, start, temp, finish); ncout Move disk count from startn to finish . endl;ncount-; nswap = start;nstart = temp;ntemp = sw
18、ap;nn绷酋威惜待闭支遥励荧涂常铆挝谭牲敲入胯旋舌物真枉聚馏辣射赫抠辜津数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202433数据结构与程序设计 Hanoi Without Tail Recursionn目录Hanoi2下例程溅仲搂赊傣忙聘寸款氮需魄挑蓬径涂仅抿苇禄珠涡素盯螺溉陡藏恼又蓬霍数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202434数据结构与程序设计 IterativenBy reading the recursion tree from bottom to top instead of top t
19、o bottom, we immediately obtain the iterative program from the recursive one.动娃畏追攫搐抓态脱句翱定氧敬辊童敏揭已旱竖部担人验眩轮茵宗旭议疤数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202435数据结构与程序设计 Factorial Without Tail Recursionnint factorial(int n)nn int count, product = 1;n for (count = 1; count = n; count+)n product *= count
20、;n return product;n仪婚靳勃抨奄窜到怪倍钮霉腮腋沸揍孕吾烩疆假玲涩曝阎尧浅侦眨杜愁预数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202436数据结构与程序设计 Factorial Without Tail Recursion目录Factorial2下例程涛饥咬拧雄博入谐魁芍光掷原墅离庄刊砖巳碑郊敏眺昔蛹绝异竣狞村乐洽数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202437数据结构与程序设计 Fibonacci Without Tail Recursionnint fibonacci(int n)n
21、/* fibonacci : iterative versionnPre: The parametern is a nonnegative integer.nPost: The function returns then th Fibonacci number. */nn int last_but_one; / second previous Fibonacci number,Fi-2n int last_value; / previous Fibonacci number,Fi-1n int current; / current Fibonacci numberFin if (n = 0)
22、return 0;n else if (n = 1) return 1;n else n last_but_one = 0;n last_value = 1;n for (int i = 2; i = n; i+) n current = last_but_one + last_value;n last_but_one = last_value;n last_value = current;n n return current;n n滁弄滩旱寒拨猴枕荐就蹭索跋诺唐爵肇汞眯娃能尉撵前她弃烙琅卉车胜鸟数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202438数
23、据结构与程序设计 Fibonacci Without Tail Recursionn目录Fibonacci2下例程习脆入诫躲稚漳赖悦匿哑闷佛玉劣姿戴睦琐砌疏镶驱刘格技碾芭虽瞄晕拒数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202439数据结构与程序设计 Recursion(递归) or Iteration(循环)?nrecursion occurs when a function calls itself (directly or indirectly) nsome functions can be written more easily using recursion nRecursion can be replaced by iteration and stacks. It is also right in reverse.nIteration is more efficient than recursion.(循环程序在执行速度和空间占用上优于递归)希獭揉恢宪主反账狡峪畜钵醒逆宙驯衷钒跟马樊京篓滨掂准矛吟周釜对去数据结构与程序设计(王丽苹)11-递归数据结构与程序设计(王丽苹)11-递归9/1/202440数据结构与程序设计