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

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

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

    莊周夢蝶

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

    sicp習題2.2節嘗試解答

    Posted on 2007-06-12 09:55 dennis 閱讀(1082) 評論(2)  編輯  收藏 所屬分類: 計算機科學與基礎
    習題2.17,直接利用list-ref和length過程
    (define (last-pair items)
      (list (list
    -ref items (- (length items) 1))))

    習題2.18,采用迭代法
    (define (reverse-list items)
      (define (reverse
    -iter i k)
        (
    if (null? i) k (reverse-iter (cdr i) (cons (car i) k))))
      (reverse
    -iter items ()))
    習題2.20,如果兩個數的奇偶相同,那么他們的差模2等于0,根據這一點可以寫出:
    (define (same-parity a . b)
      (define (same
    -parity-temp x y)
      (cond ((
    null? y) y)
            ((
    = (remainder (- (car y) x) 20)
             (cons (car y) (same
    -parity-temp x (cdr y))))
            (
    else
               (same
    -parity-temp x (cdr y)))))
      (cons a (same
    -parity-temp a b)))
    利用了基本過程remainder取模

    習題2.21,遞歸方式:
    (define (square-list items)
      (
    if (null? items)
          items 
          (cons (square (car items)) (square
    -list (cdr items)))))
    利用map過程:
    (define (square-list items)
      (map square items))

    習題2.23,這與ruby中的each是一樣的意思,將操作應用于集合的每個元素:
    (define (for-each proc items)
      (define (
    for-each-temp proc temp items)
      (
    if (null? items)
          #t
          (
    for-each-temp proc (proc (car items)) (cdr items))))
      (
    for-each-temp proc 0 items))
    最后返回true

    習題2.24,盒子圖就不畫了,麻煩,解釋器輸出:
    Welcome to DrScheme, version 360.
    Language: Standard (R5RS).
    > (list 1 (list 2 (list 3 4)))
    (
    1 (2 (3 4)))
    樹形狀應當是這樣
                   . 
    /\
    / \
    1 .
    /\
    / \
    2 .
    /\
    / \
    3 4
    習題2.25,
    第一個list可以表示為(list 1 3 (list 5 7) 9)
    因此取7的操作應當是:
    (car (cdr (car (cdr (cdr (list 1 3 (list 5 79))))))
    第二個list表示為:(list (list 7))
    因此取7操作為:
    (car (car (list (list 7))))

    第三個list可以表示為:
    (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7))))))
    因此取7的操作為:
    (define x (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))
    (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr x))))))))))))
    夠恐怖!-_-

    習題2.26,純粹的動手題,就不說了
    習題2.27,在reverse的基礎上進行修改,同樣采用迭代,比較難理解:

    (define (deep-reverse x)
      (define (reverse
    -iter rest result)
        (cond ((null? rest) result)
              ((
    not (pair? (car rest)))
               (reverse
    -iter (cdr rest)
                     (cons (car rest) result)))
              (
    else
               (reverse
    -iter (cdr rest)
                     (cons (deep
    -reverse (car rest)) result)))
               ))
      (reverse
    -iter x ()))

    習題2.28,遞歸,利用append過程就容易了:
    (define (finge x)
      (cond ((pair? x) (append (finge (car x)) (finge (cdr x))))
            ((null? x) ())
            (
    else (list x))))

    習題2.29,這一題很明顯出來的二叉活動體也是個層次性的樹狀結構
    1)很簡單,利用car,cdr
    (define (left-branch x)
      (car x))
    (define (right
    -branch x)
      (car (cdr x)))
    (define (branch
    -length b)
      (car b))
    (define (branch
    -structure b)
      (car (cdr b)))

    2)首先需要一個過程用于求解分支的總重量:
    (define (branch-weight branch)
      (let ((structure (branch
    -structure branch)))
        (
    if (not (pair? structure))
            structure
            (total
    -weight structure))))
    (define (total
    -weight mobile)
      (
    + (branch-weight (left-branch mobile))
         (branch
    -weight (right-branch mobile))))

    利用這個過程寫出balanced?過程:
    (define (torque branch)
      (
    * (branch-length branch) (branch-weight branch)))
    (define (balanced? mobile)
      (
    = (torque (left-branch mobile))
         (torque (right
    -branch mobile))))

    3)選擇函數和定義函數提供了一層抽象屏蔽,其他函數都是建立在這兩個基礎上,因此需要改變的僅僅是selector函數:
    (define (right-branch mobile) (cdr mobile))
    (define (branch
    -structure branch) (cdr branch))

    習題2.30:
    (define (square-tree tree)
      (cond ((null? tree) tree)
            ((
    not (pair? tree)) (square tree))
            (
    else
               (cons (square
    -tree (car tree)) (square-tree (cdr tree))))))
    (define (square
    -tree2 tree)
      (map (
    lambda(x)
             (
    if (pair? x)
                 (square
    -tree x)
                 (square x))) tree))

    習題2.31,進一步抽象出map-tree,與map過程類似,將proc過程作用于樹的每個節點:
    (define (tree-map proc tree)
      (cond ((null? tree) tree)
            ((
    not (pair? tree)) (proc tree))
            (
    else
               (cons (tree
    -map proc (car tree)) (tree-map proc (cdr tree))))))
    (define (square
    -tree3 tree)
      (tree
    -map square tree))

    習題2.32,通過觀察,rest總是cdr后的子集,比如對于(list 1 2 3),連續cdr出來的是:
    (2 3)
    (3)
    ()
    其他的5個子集應該是car結果與這些子集組合的結果,因此:
    (define (subsets s)
      (
    if (null? s)
          (list s)
          (let ((rest (subsets (cdr s))))
            (append rest (map (
    lambda(x) (cons (car s) x)) rest)))))



    評論

    # re: sicp習題2.2節嘗試解答  回復  更多評論   

    2007-12-26 21:31 by mabusyao
    2.32, 跟樓主思路一樣,可惜出不了結果

    (define (subsets s)
    (if (null? s) (list s)
    (let ((rest (subsets (cdr s))))
    (append rest (map (lambda (x) (cons (car s) x)) rest)))))

    (subsets (list 1 2 3))


    Welcome to DrScheme, version 371 [3m].
    Language: Advanced Student.
    (shared ((-2- (list 3)) (-4- (list 2)) (-6- (cons 2 -2-)))
    (list empty -2- -4- -6- (list 1) (cons 1 -2-) (cons 1 -4-) (cons 1 -6-)))
    >

    # re: sicp習題2.2節嘗試解答  回復  更多評論   

    2012-11-10 17:42 by Jonny Wang
    balance?過程還需要判斷子樹的平衡性,需要把最外層的和兩個子樹的and一下
    主站蜘蛛池模板: 在线观看免费大黄网站| 99ee6热久久免费精品6| 国产精品免费小视频| 亚洲欧洲av综合色无码| 在线观看av永久免费| 亚洲天堂男人影院| 在线天堂免费观看.WWW| 亚洲黄色激情视频| 日韩免费视频观看| 久久亚洲AV成人无码国产最大| 午夜视频免费成人| 黄色网址免费在线| 亚洲中文字幕在线观看| 成全在线观看免费观看大全| 亚洲理论电影在线观看| 亚洲国产精品免费视频| 亚洲性无码av在线| 高清国语自产拍免费视频国产 | 在线精品免费视频| 亚洲精品无码国产片| 免费一级毛片不卡在线播放| 天堂亚洲免费视频| 久久亚洲精品AB无码播放| 足恋玩丝袜脚视频免费网站| 久久综合久久综合亚洲| 亚洲av无码专区在线观看素人| www永久免费视频| 亚洲日本中文字幕区| 午夜视频免费成人| 最近免费字幕中文大全| 亚洲综合一区二区| 国产高清视频在线免费观看| 中文字幕的电影免费网站| 亚洲精品成人久久| 白白国产永久免费视频| 精选影视免费在线 | 亚洲日本在线观看网址| 免费国产成人高清在线观看麻豆| 国产色爽免费无码视频| 亚洲中文字幕乱码AV波多JI| 中文字幕亚洲一区二区三区 |