3

こんにちは、SICP を読んでいます。演習 1.7 で行き詰まっています。

ここに私のコードがあります:

(define (avg x y)
  (/ (+ x y) 2))

;;(avg 1 2)


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

;;(square 2)


(define (improve guess x)
  (avg guess (/ x guess)))

;;(improve 1 2)


(define (good-enough? x guess)
  (< (abs (- guess ((avg guess (/ x guess))))) 0.1))

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

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

(my-sqrt 100)

そしてDrRacketはエラーを出します:

関数呼び出し: 左括弧の後に関数が必要ですが、50.005 を受け取りました

それは何を意味し、問題を解決する方法は何ですか?

4

1 に答える 1

2

括弧の位置が間違っているなど、コードにいくつかの間違いがあります。まずgood-enough?、演習 1.7 で定義したように、次のようになります。

(define (good-enough? guess-old guess-new)
  (< (/ (abs (- guess-old guess-new)) guess)
     (/ 0.001 guess)))

そしてsqrt-iter、あなたのコードに書かれているように、無限再帰につながります。代わりにこれを試してください:

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

(define (my-sqrt x)
  (sqrt-iter 0.0 1.0 x))
于 2013-09-12T02:13:12.763 に答える