Корень куб (метод Ньютона)


Метода Ньютона для нахождения кубических корней утверждает, что для любого \х $\$ и угадай \$г\$, лучшее приближение \$\dfrac{(\dfrac{х}{м^2} + 2У)}{3}\$.

Что вы думаете об этом код для нахождения кубического корня в схеме?

(define (improveguess y x)
  ; y is a guess for cuberoot(x)
  (/ (+ (/ x (expt y 2)) (* 2 y)) 3))

(define (cube x) (* x x x))

(define (goodenough? guess x)
  (< (/ (abs (- (cube guess) x)) guess) 0.0001))

(define (cuberoot x) (cuberoot-iter 1.0 x))

(define (cuberoot-iter guess x) 
  (if (goodenough? guess x) guess
      (cuberoot-iter (improveguess guess x) x)))


3838
6
задан 23 марта 2011 в 06:03 Источник Поделиться
Комментарии
2 ответа

Если вы посмотрите на свой код для это упражнение, а также об аппроксимации квадратного корня и о том, чтобы найти Эпси, вы увидите общий образец:

У вас есть функция, которая выполняет один шаг и предикат, который говорит вам, когда вы закончите. Затем применить функцию степпинга, пока предикат выполняется. Когда вы столкнулись с распространенной схемой, как это лучше всего сделать, обычно абстрактным. Так что давайте определять применить-пока функция, которая принимает шагового функция, предикат и начальное значение и применяет функцию к значению, пока предикат выполняется:

(define (apply-until step done? x)
(if (done? x) x
(apply-until (step x) step done?)))

Теперь вы можете определить свой cuberoot функции, используя применить-пока вместо cuberoot-ИТЭР:

(define (cuberoot x)
(apply-until (lambda (y) (improve-guess y x)) (lambda (guess) (goodenough? guess)) 1.0))

Вы можете также переместить свои вспомогательные функции, как локальные функции в cuberoot функции. Таким образом, они не должны принимать х в качестве аргумента (как они закроют за это) и может таким образом быть переданы непосредственно применить-пока без использования лямбда:

(define (cuberoot x)
(define (improveguess y)
; y is a guess for cuberoot(x)
(/ (+ (/ x (expt y 2)) (* 2 y)) 3))

(define (goodenough? guess)
(< (/ (abs (- (cube guess) x)) guess) 0.0001))

(apply-until improveguess goodenough? 1.0))

5
ответ дан 23 марта 2011 в 09:03 Источник Поделиться

Ваши улучшения-думаю , наверное, лучше написал так:

(/ (+ (/ x y y) y y) 3)

Или, если определить среднее функция:

(define (mean . xs)
(/ (apply + xs) (length xs)))

тогда вы можете сделать улучшения-думаю, даже проще:

(mean (/ x y y) y y)

4
ответ дан 23 марта 2011 в 06:03 Источник Поделиться