写点什么

SICP 习题解答 1.7

用户头像
十元
关注
发布于: 2021 年 03 月 07 日

1.7

较小的数,

(sqrt 0.0004) ;

(sqrt 0.0004)  ; 0.0354008825558513(square (sqrt 0.0004))  ; 0.0012532224857331766 ;这个结果 guess平方 与 x 的差 大于 0.001,已经不满足了 good-enough? 的检查了
复制代码


较大的数,

(sqrt 12345678901234) 就算不出了,

因为 scheme 能表示的小数精度有限,在某个时候, (square guess) 与 x 之差还是大于 0.001, 因为精度有限,连续的两个 guess 之间的差太小了, improve 就没法产生改进的 guess 了,只能陷入无限循环,永远也算不出。


新的 good-enough? 函数:

(define (good-enough? previous guess)  (< (/ (abs (- previous guess)) guess) 0.0000000001))
复制代码


新的 sqrt-iter

(define (sqrt-iter guess x)  (if (good-enough? guess (improve guess x))    guess    (sqrt-iter (improve guess x) x)))
复制代码


整个:

#lang sicp
(define (square x) (* x x))
(define (good-enough? previous guess) (< (/ (abs (- previous guess)) guess) 0.0000000001))
(define (sqrt-iter guess x) (if (good-enough? guess (improve 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 (sqrt x) (sqrt-iter 1.0 x))
复制代码


用户头像

十元

关注

还未添加个人签名 2018.09.26 加入

这人眼高手低 夸夸其谈

评论

发布
暂无评论
SICP 习题解答 1.7