0

以下是我为牛顿方法编写的代码:

(define (newtons-method f guess n)
(define (newtons-method-h guess k)
 (if(= k n)
    guess
    (let ((next (- guess (/ (f guess) ((der f 0.1) guess)))))
    (newtons-method-h next (+ k 1)))))
(newtons-method-h guess 0))

以及我编写的使用牛顿法求平方根的代码:

 (define (sqrt-newt n)
 (newtons-method (lambda (x) (- (* x x) n)) 1.0 40))

我想知道... sqrt-newt 是否调用 newtons-method 进行 40 次交互?我相信答案是肯定的,但我在这里画了一个空白。

4

1 回答 1

1

只需在您的代码中添加一个计数器:

(define counter null) ; define a global variable

(define (newtons-method f guess n)
  (define (newtons-method-h guess k)
    (set! counter (add1 counter)) ; increment it at each call
    (if (= k n)
        guess
        (let ((next (- guess (/ (f guess) ((der f 0.1) guess)))))
          (newtons-method-h next (+ k 1)))))
  (set! counter 0) ; initialize it before starting
  (newtons-method-h guess 0))

(sqrt-newt 2) ; run the procedure
=> 1.4142135623730951
counter ; check the counter's value
=> 41

如您所见,该newtons-method-h过程被调用了 41 次 - 比您预期的多一次,因为该过程(= k n)在递归结束时最后一次被调用。

于 2013-09-21T21:09:15.150 回答