Una procedura si dice "ricorsiva" quando al suo interno (o dentro un'altra procedura chiamata al suo interno) contiene una chiamata a se stessa.
Vediamo come si può presentare una procedura ricorsiva:
Sub nomeProcedura()
codice
nomeProcedura()
End Sub
Oppure
Sub nomeProcedura()
codice
altraProcedura()
End Sub
Sub altraProcedura()
codice
nomeProcedura()
End Sub
Consideriamo il classico esempio del calcolo di un fattoriale ed applichiamo ad esso una metodologia di programmazione ricorsiva che viene spesso adottata e che si chiama metodologia RS (ricorsiva-strutturale).
Questa è formata da cinque fasi: specifica, base, ipotesi ricorsiva, passo e integrazione.
Vediamo le fasi nel dettaglio, in funzione dell'esempio:
Prima di definire la funzione è necessario specificare in modo completo e preciso il risultato che
si vuole ottenere La specifica potrà essere costituita da una o più relazioni espresse in modo
formale, o da un testo in linguaggio naturale.
Vogliamo una funzione che calocoli il fattoriale di un numero n, la definizione del fattoriale è la seguente: n! = n*(n-1)*(n-2)*...*1
La base di una ricorsione è il caso non ricorsivo.
Nel nostro caso vale che 0! = 1 e 1! = 1
A questo punto, assumiamo per ipotesi che la funzione operi già correttamente caso più semplice
E' il punto più importante. Utilizzando come punto di partenza l'ipotesi ricorsiva, occorre capire come ottenere il valore della funzione inizialmente specificata.
Nel nostro esempio scopriamo che n! = n*(n-1)!
Consista nel mettere insieme le informazioni precedenti per scrivere la definizione complessiva.
Nel nostro caso
Se numero <= 1 allora fattoriale = 1
altrimenti fattoriale = numero*fattoriale
Vediamo quindi come sfruttare il ragionamento effettuato.
Module modCalcoloFattoriale
Sub Main()
Dim numero As Long = 0
Dim risultato As Long = 0
Console.Write("Inserisci un intero positivo: ")
numero = Convert.ToSingle(Console.ReadLine)
risultato = Fattoriale(numero)
Console.WriteLine("Il fattoriale è: " & risultato)
End Sub
Function Fattoriale(ByVal numero As Long) As Long
If numero <= 1 Then
Return 1
Else
Return numero*Fattoriale(numero - 1)
End If
End Function
End Module