elisp - Elisp 中计算黄金比例的高效算法

标签 elisp

我编写了一个过程golden-ratio来计算黄金比例。第一个参数是我们开始计算黄金比例的数字,第二个参数是我们重复递归的次数。

(defun golden-ratio (start-num times)
  (if (eq times 0)
      start-num
    (golden-ratio (+ (/ 1.0 start-num) 1) (- times 1))))
(golden-ratio 30 250)

给出结果 1.618033988749895。但是当我尝试时

(golden-ratio 30 300)

我明白了 Lisp 嵌套超过 `max-lisp-eval-深度' 我的问题是,是否有另一种算法可以让我比 ~250 更深?

最佳答案

也许解决问题的更好方法是专注于所需的准确性而不是重复次数。通过这种方式,您可以迭代地改进部分结果,直到改进率低于准确率。我发现 do 宏特别适合这种类型的计算。您可以按如下方式处理该问题:

(defun golden-ratio (start delta)
  "Calculate the golden ratio starting at START with accuracy
DELTA."
  (do ((old (float start))
       (new (1+ (/ (float start))) (1+ (/ new))))
      ((< (abs (- old new)) delta) new)
    (setq old new)))

这样你就可以做到:

ELISP> (golden-ratio 1 1.0e-40)
1.618033988749895

关于elisp - Elisp 中计算黄金比例的高效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55836653/

相关文章:

html - 如何在 Emacs 中突出显示不匹配的 HTML 标签?

emacs - 处理过去的 Emacs Lisp 动态范围陷阱

Emacs lisp : create list using quote in local scope(e. g 函数范围)

emacs - 在 Windows 8.1 上启动时最大化 GNU Emacs

emacs - 我的替换功能有问题

Emacs 缩进/取消缩进当前行

python - Emacs:检查文件路径是否包含目录名称

Emacs Lisp 宏步进器

emacs - 使用 emacs 为文本着色显示

emacs - 如何从 run-with-idle-timer 中删除函数?