Qual è la differenza tra le due procedure? Quando dovrei usare una funzione ricorsiva invece di un normale ciclo di ripetizione?
Qual è la differenza tra le due procedure? Quando dovrei usare una funzione ricorsiva invece di un normale ciclo di ripetizione?
I tuoi "per cicli" sono fondamentalmente funzioni iterative (possono anche essere ricorsivi, ma non altrettanto probabili). Le funzioni iterative sono generalmente più veloci delle loro controparti ricorsive.
A volte una soluzione ricorsiva è molto naturale mentre una soluzione iterativa è molto imbarazzante. Vai con la ricorsione in questi casi.
Infine, se hai uno spazio limitato nello stack, vai con iterazione.
Non usare le funzioni ricorsive in cui potresti usare un ciclo semplice, a meno che non sia stato detto in un'intervista (ahh, Fibonacci, come ti amo e ti odio!). Anche allora potresti voler chiedere perché; potresti ottenere punti bonus.
Le funzioni ricorsive sono perfette per le strutture ad albero. I loop sono perfetti per le iterazioni e le sequenze.
public List<string> GetAllFilesInTree(string path)
{
List<string> files = new List<string>(GetAllFilesInFolder(path));
foreach (string subdir in GetAllFoldersInFolder(path))
{
files.AddRange(GetAllFilesInTree(path));
}
}
Regola del pollice: usa la ricorsione quando riduce lo sforzo di sviluppo (di solito nelle strutture ad albero) e quando le prestazioni non sono un problema.
La ricorsione può essere più facile e veloce da implementare in molti casi, quindi commercialmente ha senso ricorrere alla ricorsione. Nella maggior parte dei casi è possibile scrivere codice con prestazioni migliori che utilizza meno risorse non utilizzando la ricorsione. Il tuo capo probabilmente sceglierà la soluzione di ricorsione se gli dai la scelta: -)
Ricordo qualcosa su una procedura specifica su come convertire un algoritmo ricorsivo in uno non ricorsivo. Ha comportato l'estrazione degli argomenti e la creazione di variabili o array locali. Non riesco a ricordare le specifiche però, ma con un po 'di buon senso dovrebbe essere un lavoro semplice.
Le chiamate alle funzioni ricorsive possono risolvere tutti i problemi che i loop possono risolvere e alcuni. La maggior parte dei problemi rientra nella categoria che può essere risolta utilizzando entrambi e, nella maggior parte delle lingue, la soluzione iterativa è più efficiente, quindi è quello che dovresti usare in caso di dubbio.
Indipendentemente, trovare una soluzione iterativa quando conosci già quella ricorsiva, o vv., può essere un buon esercizio e spesso complicato.
Quando la funzione stessa chiama ripetutamente finché non viene soddisfatta una condizione specifica.
Svantaggi:
Leggi altre domande sui tag recursion