Elisp 中计算黄金比例的高效算法
Efficient algorithm in Elisp to compute the golden ratio
我写了一个程序 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 更深?
或许解决该问题的更好方法是关注所需的准确度而不是重复次数。通过这种方式,您可以迭代地改进您的部分结果,直到改进率低于准确性。我发现 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
我写了一个程序 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 更深?
或许解决该问题的更好方法是关注所需的准确度而不是重复次数。通过这种方式,您可以迭代地改进您的部分结果,直到改进率低于准确性。我发现 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