Visualizza la versione completa : [PASCAL]funzioni ricorsive
Salve ragazzi volevo sciogliere un dubbio riguardo ad una funzione ricorsiva:
Se ho una cosa del tipo:
function foo(parametri...)
if ( condizione1 )
..
if( condizione2 )
..
foo(parametri...)
else <<<<<<<
..
..
endif
else
foo(parametri...)
endif
end
Volevo capire una cosa:
Nel momento in cui la "condizione2" è true, io entro nell'if e richiamo la function "foo"(ricorsivamente), quando la condizione 2 diventerà falsa, entro nell'else(<<<<<<<) oppure no?
Grazie anticipatamente
Hai notato che ci sono due if?
In quella else che hai segnato ci entrerà solo se
condizione1 è vera e condizione2 è falsa
Si perfetto , grazie , avevo proprio dimenticato quell'if,
Oregon ma nel caso in cui avessi una cosa del tipo:
function foo(parametri...)
if(foo(parametri...))
<istruzioni>
else
<istruzioni>
endif
end
l'if ha come condizione la chiamata ricorsiva a foo, quando sarà vero, quando sarà falso?
Grazie.
Tu sai come una funzione in Pascal restituisce un valore al chiamante?
<nomefunzione>:=<valore> ???
C'è questa function per verificare se un albero è perfettamente bilanciato:
bilanciato(root, 0, -1)
function bilanciato(root, altezza, h_temp)
if(root = NULL) then
if(altezza = 0)
altezza=h_temp
else if(altezza != h_temp)
bilanciato := false
endif
bilanciato:=true
endif
if( (bilanciato(root->left, height, h_temp+1) )
bilanciato(root.right, altezza, h_temp+1)
endif
bilanciato:=false;
end
Vorrei sapere come funziona questa parte.
if( (bilanciato(root->left, height, h_temp+1) )
bilanciato(root.right, altezza, h_temp+1)
endif
Inizialmente supponiamo di avere la root che è != NULL, entra nel secondo if e cosa succede?
E quindi la funzione restituirà vero o falso quando lo vorrai tu inserendo quella linea nel ramo di codice che ti interessa ...
Perdonami oregon, non riesco a capire.
esegue:
if( (bilanciato(root->left, height, h_temp+1) )
Richiama la function andando sempre verso il lato sinistro(root->left), smette di entrare nell'if quando root=NULL? e quando esegue:
bilanciato(root.right, altezza, h_temp+1)
Inoltre io sò che quando assegno un valore alla function tipo: "bilanciato:=true", il processo ricorsivo conclude, restituendo il valore, è così?
Se hai preso quella funzione da un esempio in C ricordati che in C il
return
restituisce il valore e termina la funzione.
In Pascal
bilanciato:=true
restituisce il valore ma NON termina la funzione.
Dovrai inserire una
exit
per farlo.
P.S. Ma che Pascal usi ...? Come mai quelle endif ?
In realtà è P-LIKE un pseudolinguaggio usato alla federico II di napoli. Solo qui lo usiamo =D. E' simile al pascal. Comunque io volevo sapere logicamente e fisicamente cosa succedeva quando eseguivo:
if(foo(parametri...))
foo(parametri...)
endif