SICP問題2.36
全てが同数の要素からなる並びの並びをとる手続き accumulate-n の定義
(define (first-item seqs) (if (pair? seqs) (cons (car (car seqs)) (first-item (cdr seqs))) seqs)) (define (next-item seqs) (if (pair? seqs) (cons (cdr (car seqs)) (next-item (cdr seqs))) seqs)) (define (accumulate-n op init seqs) (if (null? (car seqs)) () (cons (accumulate op init (first-item seqs)) (accumulate-n op init (next-item seqs)))))
テスト
(define s (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12))) ; ((1 2 3) (4 5 6) (7 8 9) (10 11 12)) (accumulate-n + 0 s) ; (22 26 30)
一応OKなんだけど、イマイチだなぁ。ということでカンニング。
一瞬悩んだけど簡単:一段ずつ計算して cons で繋ぐのだから map car で各要素(リスト)の最初の要素を, map cdr で残りを再帰的に求めれば良い。
(define (accumulate-n op init seqs) (if (null? (car seqs)) () (cons (accumulate op init (map car seqs)) (accumulate-n op init (map cdr seqs)) )))http://sicp.naochan.com/memo.pl?p=%CC%E4%C2%EA2.36
という感じで、確かにそのとおり。
余計な手続きの定義なんていらないということですね。