4
(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))

(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.0001))

(define (square x)
  (* x x))

(define (sqrt-g x)
  (sqrt-iter 1.0 x))

sqrt用のプログラムです。問題は、new-if を使用して if を new-if に置き換えようとするとどうなるかということです。

(define (sqrt-iter guess x)
    (if (good-enough? guess x)
        guess
        (sqrt-iter(improve guess x)
                  x)))

これは新しい場合

 (define (new-if predicate then-clause else-clause)
      (cond (predicate then-clause)
            (else else-clause)))

私の意見では、2 つのプログラムの結果は同じになります。new-if と if は同じ結果を生成できるためです。

ただし、試してみるとデッド サークルなので、new-if が間違っていることが判明しました。

なぜ?

4

3 に答える 3

9

new-if関数です。関数へのすべての引数は、関数を呼び出す前に評価されます。しかしsqrt-iter、これは再帰関数であり、引数がすでに十分な場合に再帰呼び出しを行うことは避ける必要があります。

組み込みifは構文であり、条件の値に応じて、then-branch または else-branch のみを評価します。

マクロを使って書くことができますnew-if

于 2012-09-17T04:35:44.037 に答える
3

これは、代数ステッパーのデモンストレーションに最適な例です。代数ステッパーでは、計算の過程が予想とどのように異なるかを確認できます。ここでは、たとえば(new-if 1 2 3)と(if 1 2 3)の評価の違いに注意する必要があります。

これまでに代数ステッパーを試したことがない場合は、この回答を参照して、どのように見えるかを確認してください。

于 2012-09-17T09:43:28.690 に答える