递回的基本观念.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chapter 6 遞迴 遞迴的基本觀念 遞迴:recursion,程式撰寫的重要技巧 特色: 函數以遞迴條件呼叫自己本身 必須加入終止條件,以免無窮的呼叫自己 增加可讀性,但是執行效率一般會比較差 某些程式語言沒有支援遞迴的程式撰寫 簡單的遞迴範例 遞迴設計 由上而下 top-down 原始問題可以切割成若干小問題 小問題與原始問題的“外觀”相同 小問題的資料量比原始問題縮小 Divide And Conquer 切割 分別處理 合併 遞迴呼叫的範例 間接遞迴 函數呼叫自己本身,稱為直接遞迴 兩個以上函數互相呼叫,形成一迴路,稱為間接遞迴 例如:A呼叫B,B呼叫C,C呼叫A 思考停止條件時較為複雜 遞迴函數的思考 系統使用一個stack紀錄每次呼叫的順序 撰寫遞迴函數: 找出遞迴條件 找出停止條件 trace遞迴函數: 由停止條件開始執行,找出執行的規則 將規則推廣至所有的情形 遞迴函數的例子 n!的計算 乘法的計算 a*b 河內塔問題(Tower of Hanoi) 最大公因數的計算 n!的計算 n! = 1 * 2 * 3 * ... * (n-1) * n 遞迴的條件 n! = n * (n-1)! 1! = 1 (這個理所當然的條件有什麼用?) 正式的條件 乘法的計算 a*b a * b 如何用加法的遞迴方式表示? 練習 寫出n!的遞迴計算程式 河內塔問題(Tower of Hanoi) 問題:p6-12 有三根柱子A、B、C 在A上面有n個盤子,由上而下編號1到n。考慮最簡單的情形 n=3 目標:將n個盤子搬到C 搬移限制: 每次只能搬移柱子最上面的一個盤子 在整個過程中,編號大的盤子不可以放在編號小的盤子上面 河內塔問題(Tower of Hanoi) 河內塔問題 - 3個盤子處理 將1號盤子從A搬到C 2號盤子從A搬到B 1號盤子自C搬到B 3號盤子搬到C 1號盤子從B搬到A 2號盤子從B搬到C 1號盤子從A搬到C 河內塔問題 - n個盤子處理 將1至n-1的盤子從A搬到B (借用C) 將編號n的盤子從A搬到C 把1至n-1的盤子從B搬到C 重點: 編號n的盤子是一定得在最底端,才不會佔住一個柱子 遞迴條件的停止? 河內塔問題 - n個盤子處理 河內塔問題-程式與時間複雜度 程式:p6-17 時間複雜度: 假設n個盤子搬移次數是h(n) n個盤子的搬移,等於兩次n-1盤子的搬移,加上一個單一盤子的移動 h(n) = 2 * h(n-1) + 1 用數學歸納法可證得,h(n) = 2n -1 最大公因數的計算 想一想,數學上最大公因數怎麼算? e.g. gcd(180, 75) = 15 非遞迴的做法: 找出二者共同的質數因數,予以相乘 最大公因數的計算 gcd問題包含 一個終止條件(m=n and n%m==0) 兩個遞迴條件 程式撰寫時,仍然是寫在一個函數內 其他常見的遞迴應用 Fibonacci費氏數列(費伯那西) * * //p6-4 //計算1+2+…+n int sum(int n) { int r; if (n==1) r = 1; else r = sum(n-1) + n; return (r); } sum(n) = [1 + 2 + 3 + … + (n-1)] + n = sum(n-1) + n 同樣的 sum(n-1) = sum(n-2) + n-1 … sum(n) = sum(n-1) + n = sum(n-2) + (n-1) + n = sum(n-3) + (n-2) + (n-1) + n = … stop condition : sum(1) = 1 //p6-7 void rec_prn(int n) { if (n0) { rec_prn(n-1); printf(%d , n); rec_prn(n-1); } } 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 呼叫: rec_prn(4); if n1 if n=1 遞迴條件:p6-32 a * b = a * (b-1) + a = [a * (b-2) + a] + a = ... 結束條件: a * 1 = a if n1 if n=1 程式可以執行,所以包含主程式 遞迴是自己呼叫自己,所以只需要一個函數 遞迴函數中,用if區分終止條件與遞迴條件 A B C A B C A B C n 1 n-1

文档评论(0)

22255990 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档