使用牛顿法求根

问题描述 投票:1回答:2

我写了newton-method以从elisp中的Scheme示例中找到根,为>

#+begin_src emacs-lisp :session sicp :lexical t
(defun deriv(g)
  (lambda (x)
    (/ (- (funcall g (+ x dx)) (funcall g x))
       dx)))

(defvar dx 0.00001)
(defvar tolerance 0.00001)

(defun fixed-point(f guess)
  (defun close-enoughp(v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (let ((next (funcall f guess)))
    (if (close-enoughp guess next)
        next
      (fixed-point f next))))

(defun newton-transform(g)
  (lambda (x)
    (- x (/ (funcall g x) (funcall (funcall #'deriv g) x)))))

(defun newton-method(g guess)
  (fixed-point (funcall #'newton-transform g) guess))

(defun curt(x)
  (newton-method (lambda (y) (- (* y y y) x))
                  1.0))

(curt 12)
#+end_src

#+RESULTS:
: 2.2894284851069058

它可以工作,但要注意扭曲的代码:

(defun newton-transform(g)
  (lambda (x)
    (- x (/ (funcall g x) (funcall (funcall #'deriv g) x)))))

三个funcall,如果再加上更多的关闭深度,我将无法想象是糟糕的。

elisp是否有替代解决方案? (我猜它会使闭包贬值)

[我编写了牛顿法,从elisp中的Scheme示例中查找根,为#+ begin_src emacs-lisp:session sicp:lexical t(defun deriv(g)(lambda(x)(/(-(funcall g(+ x dx))(funcall gx))...

scheme elisp sicp function-call fixed-point-iteration
2个回答
0
投票

newton-transform中,(funcall #'deriv g)(deriv g)相同,因此可以消除3个funcall之一。实际上,其他两个是必需的。


0
投票

几个函数调用可以简化,我们应该实现@sds关于函数名称和约定的建议-像这样:

© www.soinside.com 2019 - 2024. All rights reserved.