В качестве теста для одного из моих классов наш учитель попросил нас протестировать рекурсивный и нерекурсивный подход к известному евклидову алгоритму:
Итерационный
(defun gcdi (a b)
(let ((x a) (y b) r)
(while (not (zerop y))
(setq r (mod x y) x y y r))
x))
Рекурсивный
(defun gcdr (a b)
(if (zerop b)
a
(gcdr b (mod a b))))
И затем я проверил тест:
(defun test-iterative ()
(setq start (float-time))
(loop for x from 1 to 100000
do (gcdi 14472334024676221 8944394323791464)) ; Fibonacci Numbers close to 2^64 >:)
(- (float-time) start))
(defun test-recursive ()
(setq start (float-time))
(loop for x from 1 to 100000
do (gcdr 14472334024676221 8944394323791464)) ; Fibonacci Numbers close to 2^64 >:)
(- (float-time) start))
И затем я запустил таймеры:
(test-recursive)
: 1.359128475189209
(test-iterative)
: 1.7059495449066162
Итак, мой вопрос в том, почему рекурсивный тест выполнялся быстрее, чем итеративный тест? Не итеративно ли почти всегда лучше рекурсии? Является ли elisp исключением?