SICP学习笔记 1.1.7 实例:使用牛顿法求平方根

 

   练习1.6

    应用序会对

 

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

 

    的new-if中的else-clause(即(sqrt-iter (improve guess x) x))进行展开,而sqrt-iter使用了递归,因此将进入死循环

 

    练习1.7

    在被求值的数很小或很大时,因为变化程度很小会导致程序进入死循环

    修改后的程序如下:

 

Java代码   收藏代码
  1. (define (square x)  
  2.   (* x x))  
  3. (define (myabs x)  
  4.   (if (< x 0) (- x) x))  
  5. (define (good-enough oguess nguess)  
  6.   (< (/ (myabs (- (square oguess) (square nguess))) (square oguess)) 0.001))  
  7. (define (average x y)  
  8.   (/ (+ x y) 2))  
  9. (define (improve guess x)  
  10.   (average guess (/ x guess)))  
  11. (define (sqrt-iter oguess nguess x)  
  12.   (if (good-enough oguess nguess)  
  13.       nguess  
  14.       (sqrt-iter nguess (improve nguess x) x)))  
  15. (define (sqrt x)  
  16.   (sqrt-iter x 1.0 x))  

 

  练习1.8

 

Scheme代码   收藏代码
  1. (define (square x) (* x x))  
  2. (define (cube x) (* x x x))  
  3. (define (myabs x)  
  4.   (if (< x 0) (- x) x))  
  5. (define (good-enough oguess nguess)  
  6.   (< (/ (myabs (- (cube oguess) (cube nguess))) (cube oguess)) 0.001))  
  7. (define (improve guess x)  
  8.   (/ (+ (/ x (square guess)) (* 2 guess)) 3))  
  9. (define (cube-root-iter oguess nguess x)  
  10.   (if (good-enough oguess nguess)  
  11.       nguess  
  12.       (cube-root-iter nguess (cube-improve nguess x) x)))  
  13. (define (cube-root x)  
 

你可能感兴趣的:(学习笔记)