問題解答
問2.38
(fold-right / 1 (list 1 2 3)) は以下のような処理になる。
(op 1
(fold-right op 1 (2 3)))
(op 1
(op 2
(fold-right op 1 (3))))
(op 1
(op 2
(op 3
(fold-right op 1 ())))
(op 1
(op 2
(op 3
1)))
(op 1
(op 2
3))
(op 1
2/3)
3/2
(fold-left / 1 (list 1 2 3)) は以下。
(iter 1 (1 2 3)) (iter (op 1 1) (2 3)) → (iter 1 (2 3)) (iter (op 1 2) (3)) → (iter 1/2 (3)) (iter (op 1/2 3) ()) → (iter 1/6 ()) 1/6
op はオペランドが入れ替わっても同じ結果を返すものであれば fold-right と fold-left で同じ値を得ることができる。
問2.39
(define (reverse sequence) (fold-right (lambda (x y) (append y (list x))) () sequence)) (define (reverse sequence) (fold-left (lambda (x y) (cons y x)) () sequence))
cons, list 周りと append などのオペレーション周りの理解が怪しい感じがしたので復習。