SICP読書録 その1 作用順序
Exercise 1.5.のBen Bitdiddleが考案したapplicative-order(作用順序、適応順序?)かどうかを調べる方法の動作解析。
(define (p) (p)) (define (test x y) (if (= x 0) x y)) (test 0 (p))
ここで僕はifの(= x 0)を評価する前にxおよびyを評価するから(test 0 (p))において(= x 0)が真になるにもかかわらず(p)を再帰してしまうのが問題なのかと考えて解けたと思った。でも、Exercise 1.6.で引っかかってしまった。よくよく考えてみると、1.1.7 Square Roots by Newton's Methodで気になるところが。
(define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))) (define (improve guess x) (average guess (/ x guess))) (define (average x y) (/ (+ x y) 2))
仮にapplicative-orderで評価すると、ifの評価対象である(good-enough? guess x)よりも先に、guessと(sqrt-iter (improve guess x) x)を先に評価することになるはず(あるいは(good-enough? guess x)を先に評価してもguessと(sqrt-iter (improve guess x) x)を評価した後でしかifの分岐が行えない可能性がある。でもそうなると再帰関数となるsqrt-iterの門番はどこになるの?
そう考えると、Exercise 1.5.の考え方が間違っている可能性もある。。。悩み中