Почему итеративная версия занимает больше времени?

11

Я просматривал http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ и увидел, что в его реализации рекурсивных и итеративных реализаций факториальной функции итеративная процедура на самом деле занимает больше времени учитывая п = 1000. Я не могу понять, почему (он не объясняет, но говорит, что это упражнение для читателя). Извините за мою новизну всего этого.

martinjacobd
источник

Ответы:

10

Две программы не эквивалентны. Рекурсивная версия вычислительная

(... ((1 * 2) * 3) * 4 ... * n)

в то время как итеративный вычисляет

(... ((n * (n-1)) * (n-2) ... * 1)

таким образом, промежуточные величины растут быстрее для итеративной версии, и вычисления больших чисел выполняются быстрее, когда задействованные числа малы (вычисление 1000! без большого числа не имеет смысла, и диалект lisp переключается на большое число автоматически).

AProgrammer
источник
1

Когда вы делаете рекурсивный алгоритм итеративным, вы должны явно реализовать стек, который отслеживает результаты. Этот акт добавляет дополнительные операции, связанные с выталкиванием и извлечением стека, которые рекурсивный алгоритм получает бесплатно (ну, не совсем бесплатно, но дополнительные операции составляют больше, чем стоимость рекурсии).

Майкл Браун
источник
1
Вы смотрели на программы? Итеративный факториал вообще не манипулирует стеком.
AProgrammer
-1

Я могу только догадываться, я даже не уверен, что эти тесты взяты из C или из кода SBLC. Я предполагаю, что виновник изменяет переменную. 1000! это довольно большое число, может быть, быстрее заполнить стек промежуточными и очистить, чем создать копию и перезаписать.

Габриэль Щербак
источник
Я думаю, они были из кода SBCL.
martinjacobd