La pratica. Se scegli la ricorsione o l'iterazione dovrebbe dipendere dalla natura del problema che stai cercando di risolvere.
Iterazione e ricorsione sono due tecniche per gestire collezioni di oggetti. Quale usi dipende dalla natura della collezione. L'iterazione si adatta alle collezioni flat come array e mappe hash; la ricorsione si adatta a collezioni annidate come strutture di dati dell'albero. Nota che una raccolta può essere fisica, come la struttura dei dati dell'albero, oppure può essere virtuale, come l'insieme di tutti i quadrati magici 4x4.
Per dirla in altro modo, se risolvere un problema può essere risolto risolvendo una serie di sotto-problemi dello stesso tipo, allora si consiglia la ricorsione. Se il problema può essere risolto direttamente, senza scomporlo in sotto-problemi annidati, viene richiesta l'iterazione.
A volte un problema può essere risolto in entrambi i modi. Qui, la tua scelta dipenderà dal giudizio professionale: quanto è complessa ogni soluzione? Quanto è difficile (e quindi, come incline al difetto) codificare? Quanto è efficiente l'algoritmo? Quale di questi fattori è più importante? Supponi di voler scrivere codice per ordinare gli elementi di un array. Qui ci sono due scelte per gli algoritmi:
-
Ordinamento inserzione lineare è una semplice soluzione iterativa: un ciclo esterno attraversa l'array visitando ogni elemento da inserire
posto; un anello interno fa scorrere quell'elemento nel punto corretto nel
(crescente) sezione ordinata della lista.
-
Quicksort funziona in modo ricorsivo: riorganizza gli elementi della lista per suddividerli in due sotto-liste, la prima con tutte le
elementi più piccoli di un valore "pivot" e il secondo con tutti
elementi più grandi del pivot (questo è un processo lineare); allora
chiama se stesso una volta su ciascuno dei due sotto-elenchi per ordinarli in posizione.
L'ordinamento di inserimento lineare è semplice da programmare e convalidare, ma ha prestazioni terribili per array di grandi dimensioni. Quicksort richiede più attenzione per programmare, ma funziona bene su array di grandi dimensioni.
La teoria. La ricorsione è una tecnica più generale e più concettualmente potente dell'iterazione. La teoria alla base della ricorsione è un po 'più profonda, il che significa che ci vuole più sforzo per "dimostrare" che un algoritmo ricorsivo è corretto, rispetto a uno iterativo. Ma a causa di questa generalità, ci sono problemi che hanno soluzioni ricorsive dirette ma non hanno semplici soluzioni iterative.
Considera l'iterazione come un coltello multiuso e la ricorsione come una spada. La spada è più versatile ma richiede più abilità e sforzo per impugnare. Se hai un nodo gordiano di un problema da risolvere, la spada è l'unica cosa che farà. Tuttavia, per la maggior parte dei problemi che potresti incontrare, il programma di utilità manterrà il lavoro svolto e lo farà in modo più rapido e semplice.
La realtà. In molti anni di lavoro nel cosiddetto mondo reale (cioè non nel mondo accademico), ho visto due o tre esempi di codice che ricorre, mentre probabilmente ho visto mezzo millilione di istanze di codice che itera.