2010-05-15から1日間の記事一覧

SICP 問題 2.39(fold-right と fold-left を使って reverse を実装)

【問題】 reverse(問題 2.18)の、問題 2.38 の fold-right と fold-left を使った、次の定義を完成せよ。 (define (reverse sequence) (fold-right (lambda (x y) ) '() sequence)) (define (reverse sequence) (fold-left (lambda (x y) ) '() sequence))…

SICP 問題 2.38(fold-rightとfold-left)

【問題】 accumulate 手続きは、並びの先頭の要素を右方の全ての要素を組み合わせた結果に組み合わせるので、 fold-right としても知られている。逆向きに仕事をしながら要素を組み合わせる他は fold-right と類似な fold-left もある。 (define (fold-left …

SICP 問題 2.37(ベクタ、マトリクスの演算)

【問題】 ベクタ v = (v_i) を数の並びで、マトリクス m = (m_ij) をベクタ(マトリクスの行)の並びで表現するとしよう。例えばマトリクス ┌ 1 2 3 4 ┐ │ 4 5 6 7 │ └ 6 7 8 9 ┘は、並び ((1 2 3 4) (4 5 6 7) (6 7 8 9) )と表現する。この表現を使えば、並…

SICP 問題 2.36(アキュムレータの拡張)

問題 手続き accumulate-n は第3引数として全てが同数の要素からなる並びの並びをとる他は accumulate と同じである。 これはアキュムレーションとして指定した手続きを、並びの全ての第1要素、全ての第2要素と言う風に作用させ、結果の並びを返す。 例えば…

SICP 問題 2.35(アキュムレータを使用して count-leaves を再定義)

問題 2.2.2節の count-leaves アキュムレーションとして再定義せよ。 (define (count-leaves t) (accumulate (map ))) 解答 まずは2.2.2節の count-leaves を再掲しちゃう。 (define (count-leaves x) (cond ((null? x) 0) ((not (pair? x)) 1) (else (+ …