Чому ітеративна версія займає більше часу?


11

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

Відповіді:


10

Дві програми не рівноцінні. Рекурсивна версія - обчислення

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

а ітеративний - обчислення

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

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


1

Коли ви робите рекурсивний алгоритм ітеративним, вам потрібно явно реалізувати стек, який відстежує результати. Цей акт додає додаткові операції, пов’язані з натисканням та вискакуванням стека, який рекурсивний алгоритм отримує безкоштовно (ну не зовсім безкоштовно, але додаткові операції складають більше, ніж вартість рекурсії).


1
Ви дивилися програми? Ітеративна факторія взагалі не маніпулює стеком.
AProgrammer

-1

Я можу лише здогадуватися, я навіть не впевнений, чи ці орієнтири походять із С або з коду SBLC. Моя здогадка - винуватець мутує змінна. 1000! це досить велика кількість, можливо, швидше заповнити стек з посередниками та очистити, ніж створити копію та перезаписати.


Думаю, це були з коду SBCL.
martinjacobd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.