RICORSIONE PICCOLO AIUTO...

di il
1 risposte

RICORSIONE PICCOLO AIUTO...

Considerato questo programma :

void fun(int)

int main()
{
int n = 9;
fun(n);
return 0;
}

void fun (int x)
{
if (x > 0)
{
fun(x-1);
printf("%2d", x);
}
return;
}
l'output visualizza 1,2,3,4,5,6,7,8,9
se il printf lo si mette prima di fun(x-1)
l'ouput visualizza 9,8,7,6,5,4,3,2,1

che mi potrebbe spiegare esattamente come funziona questa funzione ricorsiva?
Perche' cambia l'ouput cambianto la posizione del printf?

grazie a tutti
Roberto

1 Risposte

  • Re: RICORSIONE PICCOLO AIUTO...

    Ciao, alla funzione fun viene passato il paramtro x(se non ricordo male) e viene fatto un controllo per verificare se x =0 se x è diverso allora esegue la stessa funzione con x-1. la printf viene eseguita quindi dopo l'uscita dalla funzione. La prima printf dunque che viene eseguita sarà quando x è uguale a 1, perchè è l'ultima volta che viene chiamata la funzione e quindi eseguirà subito la printf di quella funzione cioè qusndo x = 1 poi tornerà a continuare le funzioni precedentemente chiamate ancora in memoria in ordine di chiamata cioè dalla + recente alla + vecchia se si puo dire. Quindi quando x = 2, 3,4 fino alla prima x passata dalla main. Mettiamo il caso x sia 10 viene:

    fun(10)->fun(9)->fun(8)->fun(7)->fun(6)->fun(5)->fun(4)->fun(3)->fun(2)->fun(1) qui non esegui fun(0) x il controllo dato quindi finisce le istruzioni della funzione fun(1) cioè printf 1 e ritorna a fan(2) la quale continua le istruzioni cioè printf 2 e ritorna a fun(3)... e cosi via tornando indientro cosi ala prima funzione chiamata dall main fun(10)

    mettendo invece la printf prima della chiamata alla funzione, viene eseguita quindi prima la stampa del numero e poi avviene la chiamata alla funzione
    fun(10)stampa 10 e chiama fun(9) ->fun(9)stampa 9 e chiama fun(8)->fun(8)stampa 8 e chiama fun(7)->fun(7) e cosi via... nella fase di ritorno cioè da fun(1) a fun(10) non ci sono + istruzioni da eseguire e quindi passa semplicemente alle funzioni precedenti.
    Spero di essere stato chiaro... ciao.
Devi accedere o registrarti per scrivere nel forum
1 risposte