リストの写像、問題2.21 – SICP(計算機プログラムの構造と解釈)その38

リストの写像

リストの各数値を与えられた引数倍する手続き square-list

(define (scale-list items factor)
  (if (null? items)
      ()
      (cons (* (car items) factor)
            (scale-list (cdr items) factor))))

(scale-list (list 1 2 3 4 5) 10)
gosh> (10 20 30 40 50)

手続きmap

手続きmap は引数として手続きとリストをとり、その手続きをリストの各要素に作用させて得られるリストを返す。

(map + (list 1 2 3) (list 40 50 60) (list 700 800 900))
gosh> (741 852 963)

(map (lambda (x y) (+ x (* 2 y)))
     (list 1 2 3)
     (list 4 5 6))
gosh> (9 12 15)

手続きmap を使った scale-list の再定義

(define (scale-list items factor)
  (map (lambda (x) (* x factor))
       items))
(scale-list (list 1 2 3 4 5) 10)
gosh> (10 20 30 40 50)

手続きmap を使うことによって抽象の壁を作り、リストの要素を取り出し操作する細部を隔離する。

問題2.21

再帰的構造の square-list

(define (square-list items)
  (if (null? items)
      ()
      (cons (square (car items)) (square-list (cdr items)))))

(square-list (list 1 2 3 4))
gosh> (1 4 9 16)

手続きmap を使った square-list

(define (square-list items)
  (map (lambda (x) (square x))
       items))

(square-list (list 1 2 3 4))
gosh> (1 4 9 16)
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»