Эффективный алгоритм в Elisp для вычисления золотого сечения - PullRequest
2 голосов
/ 24 апреля 2019

Я написал процедуру 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?

1 Ответ

2 голосов
/ 25 апреля 2019

Возможно, лучшим подходом к проблеме было бы сосредоточиться на желаемой точности, а не на количестве повторений.Таким образом, вы можете итеративно улучшать частичный результат, пока уровень улучшения не станет ниже точности.Я считаю макрос 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
...