PDA

Visualizza la versione completa : [PASCAL]funzioni ricorsive


gaten
03-07-2011, 18:36
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

oregon
03-07-2011, 19:43
Hai notato che ci sono due if?

In quella else che hai segnato ci entrerà solo se

condizione1 è vera e condizione2 è falsa

gaten
03-07-2011, 21:05
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.

oregon
03-07-2011, 21:11
Tu sai come una funzione in Pascal restituisce un valore al chiamante?

gaten
03-07-2011, 21:17
<nomefunzione>:=<valore> ???

gaten
03-07-2011, 21:31
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?

oregon
03-07-2011, 21:32
E quindi la funzione restituirà vero o falso quando lo vorrai tu inserendo quella linea nel ramo di codice che ti interessa ...

gaten
03-07-2011, 21:35
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ì?

oregon
04-07-2011, 08:16
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 ?

gaten
04-07-2011, 12:28
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

Loading