内部定点内的try交互操作

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

我正在阅读SICP的固定要点:

#+begin_src emacs-lisp :session sicp :lexical t
(defvar tolerance 0.00001)
(defun fixed-point(f first-guess)
  (defun close-enoughp(v1 v2) 
    (< (abs (- v1 v2)) tolerance))
  (defun try(guess) ;;
    (let ((next (funcall f guess)))
      (if (close-enoughp guess next)
          next
          (try next))))
  (try first-guess))
(fixed-point #'cos 1.0)
#+end_src

#+RESULTS:
: 0.7390822985224024

从上述情况中,我了解到while的一种性质是抽象概念“ try”

#+begin_src ipython :session sicp :results output pySrc/sicp_fixedpoint2.py
import math

def fixed_point(f, guess):
    while True:
        nex = f(guess)
        if abs(guess-nex) < 0.0001:
            return nex
        else:
            guess = nex #local assignment is nature of lambda
print(fixed_point(math.cos, 1))
#+end_src

#+RESULTS:
: 0.7390547907469174

所以我可以使用有效的功能抽象思想在python中编写迭代。

当反思try时,它比“尝试花一会儿的时间还多,它教给我什么?

可以在没有try的情况下进行重新构架,但是直接返回return fixed_point(f, nex)

#+begin_src ipython :session sicp :results output :tangle pySrc/sicp_fixedpoint.py
import math
tolerance = 0.00001

def fixed_point(f, guess):
    def good_enoughp(a, b):
        return abs(a-b) < tolerance

    nex = f(guess)
    if good_enoughp(guess, nex):
        return nex
    else:
        return fixed_point(f, nex)    

print(fixed_point(math.cos, 1))
#+end_src

#+RESULTS:
: 0.7390822985224024

所以SICP为什么在这里引入try,我想效率可能不是作者的主要考虑因素。

使用elisp测试

#+begin_src emacs-lisp :session sicp :lexical t
(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)))
  )
;;(trace-function #'fixed-point)
(fixed-point #'cos 1.0)
#+end_src

#+RESULTS:
: 0.7390822985224024

它按预期工作。

似乎return fixed-point f next比使用try的内部迭代要干净一些。

这里SICP考虑什么,打算教什么?

python-3.x scheme elisp sicp
1个回答
0
投票

相反:try使用起来更清洁,更高效,因为它不需要重新定义good-enough-p

((而且,您不应该在Python中使用递归)。

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