Oppure

Loading
06/06/10 12:52
gforce
Postato originariamente da carlduke:

xd....giusto...nnn avevo visto..Lol :rotfl::rotfl:

la sai fare ricorsiva ?
aaa
06/06/10 13:15
Poggi Marco
Postato originariamente da gforce:

Postato originariamente da carlduke:

xd....giusto...nnn avevo visto..Lol :rotfl::rotfl:

la sai fare ricorsiva ?


Credo basta fare così:
#include  <stdio.h>

int roll(int);

int main(int argc, char *argv[])
{
    int x = 2;
    printf("%d\n%d\n", x,roll(x));
    getchar();
    return 0;
}

int roll(int y)
{
    if (y==0)
    {
        return 0;
    }
    else
    {
       printf("%d\n", y);
       return roll(--y);
    }
}
Ultima modifica effettuata da Poggi Marco 06/06/10 13:16
aaa
06/06/10 13:29
TheKaneB
l'unica soluzione corretta è quella di Poggi Marco :-)

Ragazzi, se non sapete che vuol dire "funzione ricorsiva" non postate ciaffate, altrimenti fate solo confondere le idee a chi cerca chiarimenti!

@gforce: in generale una funzione ricorsiva, per funzionare correttamente, deve essere strutturata in 2 parti: caso base e passo ricorsivo.

Il caso base è quello in cui la funzione restituisce un valore ben definito. Il passo ricorsivo è quello in cui il valore è determinato da una seconda chiamata alla stessa funzione.

come ti ha mostrato Poggi Marco, in questo caso il caso base è dato da y == 0, mentre il passo ricorsivo è dato da y > 0 e la ricorsione è costruita in modo tale da decrementare progressivamente la y fino a raggiungere il caso base (che termina la catena di ricorsioni).
aaa
06/06/10 17:10
HeDo
Postato originariamente da TheKaneB:

[PAROLE SENSATE]



meno male che ho contato fino a 10 e ho aspettato un reply intelligente... non sai cosa stavo per scrivere... :)
aaa
06/06/10 19:53
gforce
grazie a tutti... grazie a voi ho capito le funzioni ricorsive. Mi sorge solo un dubbio. Io sapevo che con l'istruzione
return;
si uscisse dalla funzione ... ma in questo caso non l'ho fa ! commento il code sui i miei punti bui:

#include <stdio.h>

int roll (int);

int main (void) {
	int x = 2;
	roll(x); // invoca la funzione
	return 0; // esce dal programma 
}

int roll (int y) {
	if (y == 0) { //controllo se è uguale a zero, se lo è stampa 0
		printf("%d\n", y);
	} else {
		printf ("%d\n", y); // stampa il vero valore di y (che poi sarebbe x) 
		return roll (y-1); // calcola y - 1 (ris. 1) e secondo me dovrebbe uscire  dalla funzione perchè incontra un return ... ma ciò non lo fa !
	}
}


A questa mia risposta mi sono dato una spiegazione, ma non so se è giusta. Potrei paragonare un ricorsione al while ... però la ricorsione si ripete fin quando si avvera una cosa (il contrario del while) Ripeto, non so se è giusto come paragone.
aaa
06/06/10 20:28
Poggi Marco
La ricorsione non funziona come un ciclo while.
Il comando return termina bruscamente la funzione in corso, però , in questo caso viene effettuata una nuova chiamata alla funzione roll.

Per capire meglio il meccanismo, prova a fare il debug del programma.
aaa
07/06/10 6:25
gforce
Postato originariamente da Poggi Marco:

La ricorsione non funziona come un ciclo while.
Il comando return termina bruscamente la funzione in corso, però , in questo caso viene effettuata una nuova chiamata alla funzione roll.

Per capire meglio il meccanismo, prova a fare il debug del programma.


Grazie a tutti, in particolare: Marco e TheKaneB :asd:
aaa
07/06/10 18:05
gforce
modificando un po il source:
#include <stdio.h>

int roll (int);

int main (void) {
	int x = 2;
	printf("%d\n", x);
	roll(x);
	printf("%d\n", x);
	getchar();
        return 0;
}

int roll (int y) {
	if (y == 0) {
		return 0;
	}
	return roll (y-1);
}


adesso mi sorge una sola domanda (l'ultima :) ) !

Alla prima chiamata della printf mi stampa 2, invoco la funzione roll e quando uscirà dalla funzione roll, y (che poi sarebbe x) sarà uguale a 0 per tanto alla seconda chiamata della funzione printf dovrà stamparmi 0 ma non è così perchè mi stampa sempre 2.
aaa