Perché la versione iterativa richiede più tempo?


11

Stavo guardando http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ e ho visto che sulla sua implementazione delle implementazioni ricorsive e iterative della funzione fattoriale, l'iterativo impiega effettivamente più tempo dato n = 1.000. Non riesco a capire perché (non spiega, ma dice che è un esercizio per il lettore). Ci scusiamo per la mia novità per tutto questo.

Risposte:


10

I due programmi non sono equivalenti. La versione ricorsiva è informatica

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

mentre quello iterativo sta elaborando

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

quindi le quantità intermedie stanno crescendo più rapidamente per la versione iterativa e il calcolo del grande numero è più veloce quando i numeri coinvolti sono piccoli (il calcolo 1000! senza grande numero non ha senso e il dialetto lisp passa automaticamente a grande numero).


1

Quando si rende iterativo un algoritmo ricorsivo, è necessario implementare esplicitamente lo stack che tiene traccia dei risultati. Questo atto aggiunge ulteriori operazioni che si occupano di spingere e far scoppiare lo stack che l'algoritmo ricorsivo ottiene gratuitamente (beh, non del tutto gratis, ma le operazioni extra si sommano a più del costo della ricorsione).


1
Hai guardato i programmi? Il fattoriale iterativo non manipola affatto uno stack.
Programmatore il

-1

Posso solo indovinare, non sono nemmeno sicuro che quei benchmark provengano dalla C o dal codice SBLC. La mia ipotesi è che il colpevole sta mutando la variabile. 1000! è un numero abbastanza grande, forse è più veloce popolare lo stack con intermedi e ripulire che creare una copia e sovrascrivere.


Erano del codice SBCL, credo.
martinjacobd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.