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

15 August, 2007 (23:40) | Решения упражнений

Это упражнение не слишком сложное, поэтому на его решении можно заодно продемонстрировать и внутренние определения процедур.

Вот полное решение:

(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