Решение упражнения 1.46 из SICP

12 January, 2008 (22:10) | Решения упражнений

Я запишу процедуру iterative-improve таким образом, чтобы процедура проверки того, достаточно ли хорошо решение использовала значения, полученные на текущей и следующей итерации.

(define (iterative-improve good-enough? improve) 
  (define (iteration guess) 
    (let ((next (improve guess))) 
         (if (good-enough? guess next) 
             next 
             (iteration next)))) 
  iteration)

Переписанные процедуры fixed-point и sqrt будут иметь такой вид:

(define (fixed-point f first-guess) 
  ((iterative-improve (lambda (guess next) 
                              (< (abs (- guess next)) 
                                 tolerance)) 
                      f) first-guess))
(define (sqrt x) 
  ((iterative-improve (lambda (guess next) 
                              (< (abs (- (square guess) x)) 
                                 tolerance)) 
                      (lambda (guess) 
                              (average guess (/ x guess)))) 1.0))

Абстракция iterative-improve очень удачно включает в себя оба эти процесса.

Comments

Comment from gorilych
Date: July 16, 2008, 9:49 am

в sqrt процедура good-enough? должна сравнивать next, а не guess

Comment from qMax
Date: January 10, 2009, 1:36 am

ай ай!
в iterative-improve потерялся first-guess

Comment from Irv
Date: January 14, 2016, 4:38 pm

1. мне кажется правильнее возвращать guess, а не next в условии if (good-enough? guess next) next, хотя оба варианта понятны

2. в процедуре sqrt good-enoth? следовало бы реализовать как в упражнении 1.7 по принципу – следующее значение должно отличаться на маленький процент от предыдущего, иначе передача и вычисление next в процедуру good-enoth? избыточна

#lang racket

(define (% a b) (* (/ b 100) a))

(define (iterative-improve good-enouth? improve)
  (define (iter guess)
    (let [(next (improve guess))]
      (if (good-enouth? guess next)
          guess
          (iter next))))
  (lambda(x) (iter x)))

(define (sqrt x)  
  (define (improve guess)
    (/ (+ guess (/ x guess)) 2)) 
  (define (good-enouth? prev next)
    (< (abs (- next prev)) (% 0.0001 prev)))
  ((iterative-improve good-enouth? improve) 1.0))

(sqrt 49)

(define (fixed-point f guess)  
  (define (improve guess)
    (f guess))
  (define (good-enouth? prev next)
    (< (abs (- next prev)) (% 0.00001 prev)))
  ((iterative-improve good-enouth? improve) guess))

(fixed-point (lambda (x) (* 0.5 (+ x (/ 49 x)))) 1.0)

Comment from Irv
Date: January 14, 2016, 4:40 pm

good-enouth = good-enough конечно же

Write a comment