以下是我为牛顿方法编写的代码:
(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是否会调用牛顿 - 方法进行40次交互?我相信答案是肯定的,但我在这里画一个空白。
答案 0 :(得分: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)
时最后一次调用该过程,并且当递归结束时。