莊周夢蝶

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

          scip 第一章最后7題的解答

          Posted on 2007-05-18 15:58 dennis 閱讀(770) 評論(0)  編輯  收藏 所屬分類: 計算機科學與基礎
              第一章兩天前就讀完了,因為工作上的事情拖到現在才來做最后這七道題,這些題目都是要求寫一個過程返回另一個過程作為結果。

          習題1.40,顯而易見,要求cubic過程返回的就是方程本身,照著定義來就行了:
          (define (cubic a b c)
            (lambda(x) (
          + (* x x x) (* a x x) (* b x) c)))

          習題1.41,注意到了題目已經說明了:以有一個參數的過程做參數,那就很簡單了:
          (define (double g) (lambda(x) (g (g x))))

          返回lambda構造的過程,參數過程應用兩次即可,那么
          > (((double (double double)) inc) 5)
          21

          習題1.42,組合應用:
          (define (composite f g)
            (lambda(x) (f (g x))))

          習題1.43,在1.42基礎上使用遞歸即可:
          (define (repeated f n)
            (
          if (= n 1)
                f
                (composite f (repeated f (
          - n 1)))))

          習題1.44,在1.43基礎上,首先定義smooth過程:
          (define (smooth f)
            (lambda(x) (
          / (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))

          然后使用repeated過程產生n次平滑函數:
          (define (repeate-smooth n)
            (repeated smooth n))

          習題1.45,不是一下子能說清楚,經過測試可以知道n次方根搜索不動點,平均阻尼需要經過log2(n)(以2為底的對數)重復才會收斂,因此:
          (define (nth-root-test x n k)
            (fixed
          -point ((repeated average-damp k) (lambda (y) (/ x (fast-expt y (- n 1)))))
                         
          1.0))

          習題1.46,這題很有趣,產生過程的過程也是遞歸的,相當好玩,iterative-improve產生的過程需要遞歸調用自身,仍然使用iterative-improve產生:
          (define (iterative-improve good-enough improve-it)
            (lambda(guess) 
              (
          if (good-enough guess)
                  guess
                  ((iterative
          -improve good-enough improve-it) (improve-it guess)))))
          如果猜測結果足夠,返回猜測結果,如果沒有,遞歸調用lambda產生的這個過程應用于改進后的猜測值。
          重寫sqrt如下:

          (define (sqrtt x)
            (define (good
          -enough? guess)
                (
          < (abs (- (square guess) x)) 0.0001))
            (define (improve guess)
              (average guess (
          / x guess)))
            (iterative
          -improve good-enough? improve))
          注意,這里的sqrrt過程產生的是一個以初始猜測值為參數的過程,所有調用應該這樣:
          > ((sqrtt 41.0)
          2.000000000929222947

          下面的fixed-point過程也是如此。


          重寫fixed-point過程如下:
          (define (fixed-point f)
            (define tolerance 
          0.00001)
            (define (good
          -enough? guess)
              (
          < (abs (- guess (f guess))) tolerance))
            (define (improve guess) (f guess))
            (iterative
          -improve good-enough? improve))




          主站蜘蛛池模板: 亳州市| 英吉沙县| 县级市| 泰州市| 浦江县| 台州市| 巴东县| 手机| 辽宁省| 积石山| 双鸭山市| 罗田县| 巨野县| 康定县| 安龙县| 花莲县| 镇巴县| 镇雄县| 盐边县| 西峡县| 安阳县| 仙居县| 同德县| 陕西省| 大田县| 古浪县| 乐业县| 阿拉善左旗| 钦州市| 乌鲁木齐市| 万载县| 墨竹工卡县| 内黄县| 瓮安县| 乌兰浩特市| 新宁县| 伊吾县| 安多县| 同心县| 汉阴县| 榕江县|