莊周夢蝶

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

          sicp 習題1.30,1.29解答

          Posted on 2007-05-14 11:57 dennis 閱讀(713) 評論(0)  編輯  收藏 所屬分類: 計算機科學與基礎
              這節開始介紹將用高階函數做抽象的技術,比如將過程作為參數、返回值等等。習題1.30要求將書中的sum遞歸過程改造為迭代版本,解答如下:
          (define (sum-iter a term b next result)
            (
          if (> a b) 
                result
                (sum
          -iter (next a) term b next (+ result (term a)))))
          (define (sum term a 
          next b)
            (sum
          -iter a term b next 0))

          測試一下,比如求pi的過程:
          (define (sum-integers a b)
              (sum identity a inc b))

          (sum 1 10):
          =》 55

              再提下1.29的題目,使用辛普森規則計算定積分,一開始我沒有使用sum過程,自己寫了遞歸:
          (define (simpson f a b n)
           (define h (
          / (- b a) n))
           (define (simpson
          -term k)
               (cond ((or (
          = k n) (= k 0)) (f (+ a (* k h))))
                     ((even
          ? k) (* 2 (f (+ a (* k h)))))
                     (
          else (* 4 (f (+ a (* k h)))))))
            (define (simpson
          -temp f a b counter n)
              (
          if (> counter n)
                  
          0
                  (
          + (* (/ h 3.0) (simpson-term counter)) (simpson-iter f a b (+ counter 1) n))))
            (simpson
          -temp f a b 0 n)
           )

              復用sum過程,也可以這樣寫:
          (define (inc i) (+ i 1))
          (define (simpson f a b n)   
            (define (simpson
          * h)
              (define (mag k)
                (cond ((or (
          = k 0) (= k n)) 1)
                      ((odd
          ? k) 4)
                      (
          else 2)))
              (define (y k) 
                (f (
          + a (* k h))))
              (define (term k)
                (
          * (mag k) (y k)))
              (
          / (* h (sum term
                           
          0
                           inc
                           n)) 
          3))
            (simpson
          * (/ (- b a) n)))




          主站蜘蛛池模板: 改则县| 曲水县| 崇阳县| 新绛县| 化隆| 蒲江县| 武汉市| 武胜县| 平阳县| 南安市| 嘉禾县| 南漳县| 镇平县| 白山市| 大安市| 黄山市| 石狮市| 金溪县| 响水县| 平顺县| 巴里| 桦甸市| 广平县| 兴海县| 英德市| 松江区| 红原县| 临西县| 淮滨县| 德昌县| 平谷区| 临海市| 来宾市| 西盟| 北安市| 石狮市| 微山县| 梓潼县| 辉县市| 阿拉尔市| 涞水县|