SICP exercise 1.7 1.8

exercise 1.7:这道题有个前提,很大和很小的数都是不溢出,如果溢出就没意义了。原始的good-enough?是平方后与待求平方根的值相减再比较结果是否小于0.001,这很明显有问题,如果待求的数的平方根小于0.001,无论怎么减都是小于0.001的。很大的数无法精确算到0.001,会一直循环。


exercise 1.8:common lisp实现如下

(defun cuberoot (xx)
  (defun improve (x y)
    (/ (+ (/ x (* y y)) (* 2 y)) 3))
  (defun good-enough? (x y)
    (< (/ (abs (- (* y y y) x)) x) 0.001))
  (let ((prev 0.0))
    (defun good-enough?2 (y)
      (if (< (abs (- y prev)) 0.001)
          t
          (progn (setf prev y)
                 nil))))
  (defun cuberoot-iter (x y)
    (if (good-enough? x y)
        y
        (cuberoot-iter x (improve x y))))
  (cuberoot-iter xx 1.0))


你可能感兴趣的:(SICP)