PDA

Visualizza versione completa : Funzioni ricorsive


GiulioCesare
07-09-2003, 21.14.40
Salve ragazzi, è un paio di mesi che mi sto avventurando nella programmazione nel linguaggio Pascal, non chiedetemi i motivi per cui debba studiare questo linguaggio, starei qui fino a domani per elecarveli(S) . Fino ad ora non ho riscontrato grosse difficoltà, fino a quando mi sono trovato di fronte al concetto di funzioni ricorsive, qualcuno mi saprebbe spiegare cosa sono e come si scrive un algoritmo di una funzione del genere?

Dav82
07-09-2003, 21.27.01
Le funzioni ricorsive sono funzioni che chiamano loro stesse in una propria istruzione.
Per esempio per calcolare il fattoriale di un numero si può usare una funzione ricorsiva, infatti 8! = 8 * 7!: come vedi per calcolare il fattoriale usi all'interno del calcolo il fattoriale stesso (sì lo so si può calcolare molto più velocemente in altro modo, ma è per fare un esempio!).
La funzione potrebbe essere così:

public int fattoriale (int argomento){
if (argomento == 1) return argomento;
else return (argomento * fattoriale (argomento - 1));
}

Come vedi ad ogni passaggio "argomento" diminuisce di uno, fino ad arrivare ad essere pari a 1. Quest'ultimo si chiama caso base della ricorsione. In tutti gli altri casi non base avviene invece la chiamata ricorsiva.
E' molto importante imparare a scrivere un algoritmo in forma ricorsiva, per acquisire abilità e logica nella programmazione; d'altra parte l'uso pesante della ricorsione è da evitare, poichè caricando ogni volta un nuovo ambiente sullo stack rallenta l'esecuzione di tutto il programma.

Come esercizio puoi provare a implementare una funzione ricorsiva che generi la sequenza di Fibonacci, o che calcoli la potenza ennesima di una data base.

Spero d'esserti stato d'aiuto!

Ciao! :)

LoryOne
08-09-2003, 22.40.11
La spiegazione di Dav è eccellente.
Posso solo aggiungere una cosa:
Ricorrere alle funzioni ricorsive è l'ultima risorsa di un programmatore.
Ciò non toglie che in rari casi sia una soluzione da prendere in considerazione (parlo per esperienze personali) :)