SICP 1.45 1.46

解:1.45

试验的结果是两次平均阻尼可出结果,但结果会随着平均阻尼次数的增加而震荡,结果不精确。使用了1.46定义的过程

(define (compose f g)
  (lambda (x) (f (g x))))

(define (repeated f n)
  (if (= n 1)
      f
      (compose f (repeated f (- n 1)))))

(define (average-damp f)
  (lambda (x) (/ (+ x (f x)) 2.0)))

(define (sqrt-n x n r)
  (fixed-point (repeated (average-damp (lambda (y) (/ x (expt y (- n 1))))) 
                         r)
               1.0))
更正:
(define (sqrt-n x n r)
  (fixed-point ((repeated average-damp r) (lambda (y) (/ x (expt y (- n 1)))))
               1.0))


1.46

(define (iterative-improve good-enough? improve)
  (define (try x)
    (let ((next (improve x)))
      (if (good-enough? x next)
          next
          (try next))))
  try)

(define tolerance 0.00001)

(define (close-enough? v1 v2)
  (< (abs (- v1 v2)) tolerance))

(define (fixed-point f first-guess)
  ((iterative-improve close-enough? f) first-guess))

(define (sqrt x)
  (define (good-enough? dummy guess)
    (< (abs (- (* guess guess) x)) tolerance))
  (define (improve guess)
    (/ (+ ( / x guess) guess) 2.0))
  ((iterative-improve good-enough? improve) 1.0))


总结下:lisp不愧是用来做高阶函数演算的,这些功能用C来实现的话还真不知道该怎么写,写出来估计也会很丑。

你可能感兴趣的:(SICP 1.45 1.46)