# SICP-1.1.7节练习

lispor posted @ Feb 12, 2011 05:13:50 AM in Scheme with tags SICP , 1647 阅读

```Alyssa P. Hacker doesn't see why if needs to be provided as a special form. “Why can't I just define it as an ordinary
procedure in terms of cond?” she asks. Alyssa's friend Eva Lu Ator claims this can indeed be done, and she defines a
new version of if:

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

Eva demonstrates the program for Alyssa:

(new-if (= 2 3) 0 5)
5
(new-if (= 1 1) 0 5)
0

Delighted, Alyssa uses new-if to rewrite the square-root program:

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

What happens when Alyssa attempts to use this to compute square roots? Explain.```

```sqrt 函数将会报错：“Error:Stack overflow!”，

new-if 会首先对它的三个参数求值，进而进入 sqrt-iter 过程体，直至报错！
```

```The good-enough? test used in computing square roots will not be very effective for finding the square roots of very
small numbers. Also, in real computers, arithmetic operations are almost always performed with limited precision. This
makes our test inadequate for very large numbers. Explain these statements, with examples showing how the test fails
for small and large numbers. An alternative strategy for implementing good-enough? is to watch how guess changes
from one iteration to the next and to stop when the change is a very small fraction of the guess. Design a square-root
procedure that uses this kind of end test. Does this work better for small and large numbers?```

```当所给数小于 0.001 时，所求结果误差较大，如：
scheme@(guile-user)> (sqrt 0.0001)
0.0323084483304812
;<主要是因为 good-enough? 过程中 0.001 数值决定误差大小的

scheme@(guile-user)> (sqrt 2e35)
C-c ERROR: In procedure scm-error:
ERROR: User interrupt
;<当 guess 接近于 2e35 的平方根时,guess 值非常大,将会导致计算结果在很大区间波动，以至于再(improve guess)也无法满足 good-enough? 过程>

(define (sqrt x)
(define last-guess 0)
(define (good-enough? guess)
(let ((diff (- guess last-guess)))
(set! last-guess guess)
(< (abs (/ diff guess))
0.001)))
(define (improve guess)
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))```

```Newton's method for cube roots is based on the fact that if y is an approximation to the cube root of x, then a better
approximation is given by the value
x/y^2 + 2y
----------
3
Use this formula to implement a cube-root procedure analogous to the square-root procedure. (In section 1-3-4 we
will see how to implement Newton's method in general as an abstraction of these square-root and cube-root procedures.)
```

```一、课程版<未改进版>：
(define (curt x)
(define (good-enough? guess)
(< (abs (- (cube guess) x))
0.001))
(define (improve guess)
(/ (+ (/ x (square guess))
(* 2 guess))
3))
(define (curt-iter guess)
(if (good-enough? guess)
guess
(curt-iter (improve guess))))
(curt-iter 1.0))

(define (curt x)
(define last-guess 0)
(define (good-enough? guess)
(let ((diff (- guess last-guess)))
(set! last-guess guess)
(< (abs (/ diff guess))
0.001)))
(define (improve guess)
(/ (+ (/ x (square guess))
(* 2 guess))
3))
(define (curt-iter guess)
(if (good-enough? guess)
guess
(curt-iter (improve guess))))
(curt-iter 1.0))```

Leo Nagle 说:
May 01, 2019 11:52:02 PM

With write of these lines on here you did very good work from developers of codes can get better working progresses. If you are interested into hiring of

top online resume writing services then read reviews from official sites.

(输入验证码)
or Ctrl+Enter