莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          sicp 1.11 1.12習題解答

          Posted on 2007-05-09 14:57 dennis 閱讀(1296) 評論(2)  編輯  收藏 所屬分類: 計算機科學與基礎
              這個小節主要講解了迭代與樹形遞歸,遞歸比起迭代更易于理解和直觀,而迭代相比于遞歸則效率更高,一般計算機的遞歸實現都是使用堆棧結構實現的,當遞歸層次太深的時候容易導致棧溢出,而迭代則沒有這樣的問題。
          習題1.11是這樣的:
              如果n<3,那么f(n)=n;如果n>=3,那么f(n)=f(n-1)+2f(n-2)+3f(n-3),請寫一個采用遞歸計算過程f的過程,再改寫一個采用迭代計算過程計算f的過程。

          解答:
          1.采用遞歸的話就很簡單了,可以將條件直接描述為一個lisp過程,沒什么好解釋的:
          (define (f n)
                  (
          if (< n 3)
                      n
                      (
          + (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3))))))
          2。迭代就相對麻煩點,將遞歸轉化為迭代,關鍵在于找出迭代每一步之間的差異,這個差異就是每次迭代變化的量,找出這個固定編號的量就是問題的關鍵。很容易就可以看出f(n)和f(n-1)之間的差距就是:2f(n-2)+3f(n-3)。這就提示我們需要保持3個順序的狀態變量:f(n-2)、 f(n-1) 、f(n),迭代向前一步的時候:f(n-2)被f(n-1)取代,f(n-1)被f(n)取代,將f(n)+2f(n-2)+3f(n-3)做為新的f(n)。迭代是自底向上,初始化的3個變量就是0、1、2,這樣就可以相應地寫出一個迭代版本的解答:
          (define (f-iter a b c n)
                    (
          if (= n 2)
                        c
                        (f
          -iter b c (+ c (* 2 b) (* 3 a)) (- n 1))))
          (define (f
          -i n) (f-iter 0 1 2 n))

          可以測試一下,在n數目比較大的時候,遞歸版本速度明顯變慢甚至棧溢出,而迭代版本就比較快了。

          習題1.12:用遞歸過程描述帕斯卡三角(或者說楊輝三角)
          根據楊輝三角的特點,x行y列的數字等于x-1行y列的數字和x-1行y-1列的數字之和,就可以解決這個問題:
          (define (pascal x y)
                  (cond ((
          > y x) (display "error"))
                        ((
          = x 11)
                        ((
          = x 21)
                        ((
          = y 11)
                        ((
          = x y) 1)
                        (
          else 
                        (
          + (pascal (- x 1) y) (pascal (- x 1) (- y 1))))))



          評論

          # re: sicp 1.11 1.12習題解答  回復  更多評論   

          2015-03-23 23:54 by cuipengfei
          (f-i 1)
          會無法終結

          # re: sicp 1.11 1.12習題解答  回復  更多評論   

          2015-03-30 11:57 by fuck me
          在n數目比較大的時候,遞歸版本速度明顯變慢甚至棧溢出,而迭代版本就比較快了。

          這句話有問題,遞歸的深度只與n有關,遞歸版本并沒有比迭代版本占用更多內存資源
          主站蜘蛛池模板: 镇江市| 阿鲁科尔沁旗| 宾阳县| 兴文县| 洪湖市| 舟山市| 高邮市| 昂仁县| 梅州市| 延寿县| 海安县| 甘德县| 昌图县| 九江市| 钟山县| 上蔡县| 新邵县| 香河县| 马公市| 饶河县| 灵璧县| 昌江| 突泉县| 万全县| 三穗县| 昌宁县| 文登市| 鄂尔多斯市| 苏尼特右旗| 岐山县| 翁源县| 开原市| 舞阳县| 集贤县| 辰溪县| 内丘县| 阿鲁科尔沁旗| 万宁市| 清镇市| 乌拉特前旗| 郴州市|