2008/12/31

【Scheme】問題1.6@SICP

なぜ「if」が特殊形式なのか。「new-if」関数を定義して確かめてみるという問題。 実際やってみたけど、ピンとこなかった。(ちゃんとifの動作を思い出してればわかったはず)

;;not special syntax. new-if procidure.
(define new-if
  (lambda (predicate then-clause else-clause)
    (cond 
      (predicate then-clause)
      (else else-clause))))

(new-if (= 2 3) 0 5);;=> 5
(new-if (= 1 1) 0 5);;=> 0
こないだのsqrt内のgood-enough?で使われているifをnew-ifに置き換えるとエラー。ピンとこなかったのでまんまと解答集を見てみる。
(define square
  (lambda (x)
    (* x x)))

(define avarage
  (lambda (x y)
    (/ (+ x y) 2)))

;; "if" replaced "new-if"
(define sqrt
  (lambda (x)
    (define improve
      (lambda (guess)
        (avarage guess (/ x guess))))
    (define good-enough? 
      (lambda (guess)
        (< (abs (- (square guess) x)) 0.001)))
    (define sqrt-iter
      (lambda (guess)
        (new-if (good-enough? guess)
          guess
          (sqrt-iter (improve guess)))))
    (sqrt-iter 1.0)))

(sqrt 9);;=> 3.00009155413138
そうだった。 ifはpredicateが真の場合は2つ目のパラメータを評価しないんだった。 new-ifではnew-ifが評価される前にsqrt-iterが評価されて無限再帰ですね。

0 件のコメント:

コメントを投稿