Решение упражнения 1.8 из SICP
Это упражнение не слишком сложное, поэтому на его решении можно заодно продемонстрировать и внутренние определения процедур.
Вот полное решение:
(define (qbrt-iter guess x) (if (good-enough? guess x) guess (qbrt-iter (improve guess x) x)))
(define (good-enough? guess x) (< (abs (- (qube guess) x)) 0.001))
(define (qube x) (* x x x))
(define (improve guess x) (/ (+ (/ x (square guess)) (* 2 guess)) 3))
(define (square x) (* x x))
(define (qbrt x) (qbrt-iter 1.0 x))
А теперь введем блочную структуру и спрячем функции, которые не интересуют пользователя функции qbrt:
(define (qbrt x) (define (qube x) (* x x x)) (define (square x) (* x x)) (define (qbrt-iter guess) (define (good-enough?) (< (abs (- (qube guess) x)) 0.001)) (define (improve) (/ (+ (/ x (square guess)) (* 2 guess)) 3)) (if (good-enough?) guess (qbrt-iter (improve)))) (qbrt-iter 1.0))
Все предельно просто.
Comments
Comment from Sergey Khenkin
Date: August 15, 2007, 5:43 pm
Конечно же, можно и здесь применить улучшение алгоритма из упражнения 1.7.
Это остается на откуп любознательному читателю.
Write a comment