Arantium Maestum

プログラミング、囲碁、読書の話題

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))