<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    sicp習題2.33-2.39嘗試解答

    Posted on 2007-06-27 15:14 dennis 閱讀(485) 評論(3)  編輯  收藏 所屬分類: 計算機科學與基礎
    這一節的內容非常有趣,通過將序列作為interface,在此基礎上進而提取出各種高階操作(map,filter,accumulate,enumerate等),由此引出模塊化設計的討論。模塊化設計帶來復雜性的降低,同時可能引入性能上的損失,比如書中對sum-odd-squares過程的兩種寫法,原來的寫法枚舉列表元素的過程散落在累積、過濾、映射的過程中,主要一次循環就夠了,而通過三個高階過程來操作反而需要3次的遍歷。

    習題2.33,將map,append,length基本過程用累積操作重新定義,聯系以往的實現通過觀察和測試可以得出:
    (define (map p sequence)
      (accumulate  (
    lambda(x y) 
                    (cons (p x) y))       
                           () sequence))
    (define (append seq1 seq2)
      (accumulate cons seq2 seq1))
    (define (length sequence)
      (accumulate (
    lambda(x y)
                    (
    + 1 y))
                    0 sequence))
    難點就在于累積的操作。

    習題2.34,Horner規則求多項式,難點也是累積操作的定義:
    (define (horner-eval x coefficient-sequence)
      (accumulate (
    lambda(this-coeff higher-terms)
                    (
    + this-coeff (* x higher-terms)))
                  0 coefficient
    -sequence))
    只要記住lambda中的y其實是另一個遞歸的accumulate就比較容易完成了。
    測試下:
    > (horner-eval 2 (list 1 3 0 5 0 1))
     
    79

    習題2.35,利用map和accumulate重新定義count-leaves統計樹的節點數目:
    (define (count-leaves t)
      (accumulate 
    + 0 (map (lambda (x) (if (pair? x) (count-leaves x) 1)) t)))
    map過程的參數op是過程
    (lambda (x) (if (pair? x) (count-leaves x) 1))
    當x是列表,遞歸調用count-leaves,否則返回個數1

    習題2.36,列表的列表,因此map過程的第一個參數是一個過程作用于列表中的每個列表,當然是采用car將它們首項取出然后進行op操作,因此:
    (define (accumulate-n op init seqs)
      (
    if (null? (car seqs))
          ()
          (cons (accumulate op init (map car seqs))
                (accumulate
    -n op init (map cdr seqs)))))

    習題2.37,list作為Lisp的基本結構可以演化出各式各樣的復雜結構,比如此題就將列表作為矢量,矢量通過組合成為矩陣,3個解答就是矩陣的運算:
    (define (dot-product v w)
      (accumulate 
    + 0 (map * v w)))
    (define (matrix
    -*-vector m v)
      (map (
    lambda (x) (dot-product x v)) m))
    (define (transpose mat)
      (accumulate
    -n cons () mat))
    (define (matrix
    -*-matrix m n)
      (let ((cols (transpose n)))
        (map (
    lambda (x) (matrix-*-vector cols x)) m)))
    知道矩陣運算的定義得出結果并不困難。

    習題2.38,計算下結果:
    > (fold-right / 1 (list 1 2 3))
    1 1/2
    ;也就是3
    /2

    > (fold-left / 1 (list 1 2 3))
    1/6
    > (fold-right list () (list 1 2 3))
    (
    1 (2 (3 ())))
    > (fold-left list () (list 1 2 3))
    (((() 
    123)

    如果想使這兩個過程的結果相同,op需要滿足交換率和結合率的條件。

    習題2.39:
    ;2.39
    (define (reverse
    -list sequence)
      (fold
    -right (lambda(x y)(append y (list x))) () sequence))
    (define (reverse
    -list2 sequence)
      (fold
    -left (lambda(x y) (cons y x)) () sequence))





    評論

    # re: sicp習題2.33-2.39嘗試解答  回復  更多評論   

    2011-02-18 11:24 by shiqicai
    哥們,你習題2.33跑沒跑過啊,根本就做錯了!

    # re: sicp習題2.33-2.39嘗試解答  回復  更多評論   

    2011-02-18 11:26 by dennis
    @shiqicai
    那請給我一個正確答案嘛

    # re: sicp習題2.33-2.39嘗試解答  回復  更多評論   

    2011-02-18 11:30 by dennis
    @shiqicai
    回頭看了下,沒發現有什么問題,我這個解答跟下面這個解答是一樣的
    http://community.schemewiki.org/?sicp-ex-2.33
    主站蜘蛛池模板: 性xxxx视频免费播放直播| a级毛片无码免费真人久久| 日韩内射激情视频在线播放免费 | 亚洲日韩中文字幕| 8x网站免费入口在线观看| 亚洲国产老鸭窝一区二区三区| 久久久国产精品福利免费| 国产AV无码专区亚洲Av| 91青青青国产在观免费影视| 亚洲电影在线播放| 四虎永久在线观看免费网站网址| 亚洲AV无码无限在线观看不卡 | 亚洲GV天堂无码男同在线观看| 日韩高清在线高清免费| 国产亚洲人成在线播放| 亚洲国产中文字幕在线观看| jizz中国免费| 亚洲嫩模在线观看| 很黄很色很刺激的视频免费| 亚洲精品美女久久7777777| 亚洲AV无码不卡在线观看下载 | 亚洲国产成人精品激情| 免费涩涩在线视频网| 免费人成大片在线观看播放电影| 中文字幕亚洲天堂| 免费无码中文字幕A级毛片| 中文字幕亚洲综合小综合在线| 日韩精品视频免费观看| 中文字幕免费在线视频| 久久国产亚洲精品无码| 我要看免费的毛片| 国产视频精品免费视频| 99ri精品国产亚洲| 国产一区二区三区无码免费| 日韩免费高清播放器| 国产成人精品日本亚洲11| 亚洲伊人成无码综合网| 综合在线免费视频| 久久久久久久久久久免费精品| 亚洲国产亚洲片在线观看播放| www.亚洲精品|