我写了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))...
在newton-transform
中,(funcall #'deriv g)
与(deriv g)
相同,因此可以消除3个funcall
之一。实际上,其他两个是必需的。
几个函数调用可以简化,我们应该实现@sds关于函数名称和约定的建议-像这样: