沒事干找了幾個SICP上的習題做,先是一道以前只想出一種很啰嗦的寫法的題目
Ex 2.18
把一個列表倒過來。不習慣在lisp里用iterative方式 >,<


(define?(reverse?items)
??(define?(reverse-iter?i?k)
????(if?(null??i)
????????k
????????(reverse-iter?(cdr?i)
??????????????????????(cons?(car?i)?k))))
?
??(reverse-iter?items?()))
接下來幾題都是Map-Reduce思想的應用(或者照書上的說法,用enumerator - filter - map - accumulator這四個步驟操作一個list)
用到的幾個函數:


(define?(filter?predicate?sequence)
??(cond?((null??sequence)?null)
????????((predicate?(car?sequence))
?????????(cons?(car?sequence)?
???????????????(filter?predicate?(cdr?sequence))))
????????(else?(filter?predicate?(cdr?sequence)))))

(define?(accumulate?op?initial?sequence)
??(if?(null??sequence)
??????initial
??????(op?(car?sequence)
??????????(accumulate?op?initial?(cdr?sequence)))))

(define?(enumerate-interval?low?high)
??(if?(>?low?high)
??????null
??????(cons?low?(enumerate-interval?(+?low?1)?high))))

(define?(enumerate-tree?tree)
??(cond?((null??tree)?null)
????????((pair??tree)
?????????(append?(enumerate-tree?(car?tree))
?????????????????(enumerate-tree?(cdr?tree))))
????????(else?(list?tree))))

enumrate-tree 的功能是遍歷一個樹狀結構,把其中的所有葉子保存在一個list中。
Ex 2.34
利用Horner's rule計算多項式結果(這公式這幾天還經常碰到)


(define?(hornel-eval?x?coefficient-sequence)
??(accumulate?(lambda?(this-coeff?higher-terms)
????????????????(+?this-coeff?(*?x?higher-terms)))
??????????????0
??????????????coefficient-sequence))

(define?(count-leave?tree)
??(accumulate?+
??????????????0
??????????????(map?(lambda?(x)?1)
???????????????????(enumerate-tree?tree))))

(define?(count-leaves?t)
??(accumulate?+?0?(map?(lambda?(x)?(if?(pair??x)?(count-leaves?x)?1))?t)))

(define?(accumulate-n?op?init?seqs)
??(if?(null??(car?seqs))
??????null
??????(cons?(accumulate?op?init?(map?car?seqs))
????????????(accumulate-n?op?init?(map?cdr?seqs)))))
> (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))
(22 26 30)
Ex 2.18
把一個列表倒過來。不習慣在lisp里用iterative方式 >,<










接下來幾題都是Map-Reduce思想的應用(或者照書上的說法,用enumerator - filter - map - accumulator這四個步驟操作一個list)
用到的幾個函數:



























enumrate-tree 的功能是遍歷一個樹狀結構,把其中的所有葉子保存在一個list中。
Ex 2.34
利用Horner's rule計算多項式結果(這公式這幾天還經常碰到)







Ex 2.35
數出一棵樹中的葉子數。這題我的做法比較土,沒想到map-reduce操作上的遞歸,而是把葉子節點的值都改成1然后一個累加。







其實只要遞歸調用主函數就行了




Ex 2.36
可以理解為計算矩陣各列之和吧







> (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))
(22 26 30)