SICPの勉強 問題2.20~21
2.20
引数のリストの先頭の要素が奇数なら奇数の要素のみ全て、偶数なら偶数の要素のみ全てのリストを返す関数:
(defn same-parity [x & xs] (letfn [(p? [n] (= (rem x 2) (rem n 2))) (f [items] (cond (empty? items) nil (p? (first items)) (cons (first items) (f (rest items))) :else (f (rest items))))] (cons x (f xs))))
・・・filter万歳!
(defn same-parity-m [x & xs] (cons x (filter #(= (rem x 2) (rem % 2)) xs)))
2.21
リストの全ての要素を二乗する関数:
(defn sq [x] (* x x)) (defn square-list [items] (if (empty? items) nil (cons (sq (first items)) (square-list (rest (items)))))) (defn square-list-map [items] (map sq items))