Written by xinyiman Ottobre 24, 2011, 02:13:00 pm23834 ViewsRating: 0 (0 Rates)Print
Per funzioni/procedure ricorsive si intendono
funzioni/procedure che al loro interno richiamano loro stesse. Questo
tipo di logica che viene chiamata logica ricorsiva permette un codice
più pulito e più facilmente leggibile. Prendiamo in considerazione
l'esempio principe per capire la ricorsione: il fattoriale.
{La
funzione che permette la fatturazione di un numero}
function
Fatt(numero: integer): longint;
begin
if
numero=1 then
Fatt:=numero
else
Fatt:=(numero)*(Fatt(numero-1));
end;
Come si può vedere la funzione in questione si chiama
Fatt e prende come parametro un numero intero. Ma se andiamo ad
analizzare il codice possiamo trovare la seguente riga come anomala:
Fatt:=(numero)*(Fatt(numero-1)); perché
ritorniamo come valore la moltiplicazione del parametro per il
risultato di una chiamata a se stessa. Cioè all'interno della
funzione Fatt esiste una chiamata alla funzione Fatt. Questo modo di
usare le funzioni/procedure è molto pulito e facile da interpretare,
ma ad esempio rispetto ad un ciclo all'interno di una funzione occupa
più spazio in memoria. Per creare delle buone funzioni/procedure
ricorsive è necessario che le stesse non entrino in un ciclo
infinito, per ciclo infinito si intende che non si verifica mai la
condizione per uscire dal ciclo. Per esempio immaginiamo di aver
dichiarato come variabile globale, quindi visibile anche all'interno
di funzioni, un vettore lungo 50 celle di nome esempioric, e vogliamo
sapere quante celle sono valorizzate con il numero 20; dovremmo
scrivere la seguente funzione non ricorsiva:
function
Conteggia20(): integer;
var
i:
integer;
cont:
integer;
begin
cont:=0;
for
i:=0 to 49 do
begin
if
(esempioric[i]=20) then
begin
cont:=cont+1;
end;
end;
Conteggia20:=cont;
end;
Così facendo abbiamo una funzione che cicla fino a fine
vettore e ogni qual volta incontra un valore 20 all'interno del
vettore incrementa di uno la variabile cont, che corrisponde al
risultato che vogliamo ottenere. Ma questo non è l'unico modo per
scrivere questa funzione, perché con la ricorsione possiamo
ottenere:
function
Conteggia20Ric(indice: integer): integer;
begin
if
indice>=50 then
Conteggia20Ric:=0
else
begin
if (esempioric[indice]=20) then
Conteggia20Ric:=1+Conteggia20Ric(indice+1)
else
Conteggia20Ric:=Conteggia20Ric(indice+1);
end;
end;
Come si può evincere dall'esempio non esiste un ciclo
all'interno della funzione stessa, ma semplicemente la funzione
analizza il valore della prima cella e poi se non si trova all'ultima
cella controlla tramite una chiamata a se stessa (e qui entra in
gioco la ricorsione) il valore della cella successiva. C'è da notare
anche una altra cosa che la seconda funzione scritta (quella
ricorsiva) ha un parametro, che corrisponde alla cella del vettore
che deve analizzare, quindi quando dal programma principale
richiameremo la funzione bisogna passargli come parametro il valore
0.
xinyiman registered at Italian community of Lazarus and Free Pascal on Ottobre 14, 2011, 10:56:28 pm and has posted 3286 posts in the boards since then. Last visit was Oggi alle 05:45:31 pm.
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.