Elisp中的高效算法来计算黄金比率

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

我写了一个程序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 nesting exceeds `max-lisp-eval-depth'我的问题是,是否有另一种算法可以让我超过~250?

elisp
1个回答
2
投票

或许更好地解决问题的方法是专注于所需的准确度而不是重复次数。这样,您可以迭代地改善部分结果,直到改善率低于准确度。我发现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
© www.soinside.com 2019 - 2024. All rights reserved.