Warum dauert die iterative Version länger?


11

Ich habe mir http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ angesehen und festgestellt, dass bei seiner Implementierung der rekursiven und iterativen Implementierungen der Fakultätsfunktion die Iteration tatsächlich länger dauert gegeben n = 1.000. Ich kann nicht herausfinden warum (er erklärt es nicht, sagt aber, dass es eine Übung für den Leser ist). Entschuldigen Sie meine Neuheit in all dem.

Antworten:


10

Die beiden Programme sind nicht gleichwertig. Die rekursive Version berechnet

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

während der iterative rechnet

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

Daher wachsen Zwischenmengen für die iterative Version schneller und die Berechnung großer Zahlen ist schneller, wenn die beteiligten Zahlen klein sind (das Berechnen von 1000! ohne große Zahlen hat keinen Sinn und der Lisp-Dialekt wechselt automatisch zu großen Zahlen).


1

Wenn Sie einen rekursiven Algorithmus iterativ machen, müssen Sie den Stapel, der die Ergebnisse verfolgt, explizit implementieren. Dieser Vorgang fügt zusätzliche Operationen hinzu, die sich mit dem Verschieben und Poppen des Stapels befassen, den der rekursive Algorithmus kostenlos erhält (nicht ganz kostenlos, aber die zusätzlichen Operationen summieren sich zu mehr als den Kosten der Rekursion).


1
Hast du dir die Programme angesehen? Die iterative Fakultät manipuliert einen Stapel überhaupt nicht.
AProgrammer

-1

Ich kann nur raten, ich bin mir nicht einmal sicher, ob diese Benchmarks vom C oder vom SBLC-Code stammen. Ich vermute, der Täter mutiert die Variable. 1000! ist eine ziemlich große Zahl, vielleicht ist es schneller, Stapel mit Zwischenprodukten zu füllen und zu bereinigen, als eine Kopie zu erstellen und zu überschreiben.


Die stammen aus dem SBCL-Code, denke ich.
Martinjacobd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.