sicp习题2.2节尝试解答

    xiaoxiao2024-04-02  130

    习题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)  2 0 )          (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 ))) 树形状应当是这样 . /\ / \ /\ / \ . /\ / \习题2.25, 第一个list可以表示为(list 1 3 (list 5 7) 9) 因此取7的操作应当是: (car (cdr (car (cdr (cdr (list  1   3  (list  5   7 9 )))))) 第二个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-))) > 文章转自庄周梦蝶  ,原文发布时间5.17 相关资源:SICP 习题答案
    最新回复(0)