Newsgroup: it.comp.lang.c++
Titolo: Chiarimenti su ricorsione

Salve,
potreste spiegarmi come funziona questa ricorsione?
Non capisco la logica di come vengono chiamate le varie funzioni annidate.
#include <iostream>
void pippo (int x) {
 if (x == 0)
  std::cout << "esco" << std::endl;
 else {
  for (int i = 0; i < 2; i++) {
   std::cout << i << " " << x << std::endl;
   pippo (x - 1);
  };
 };
};
int main () {
 pippo (3);
 return 0;
}
L'output è questo:
Il primo valore è la i, il secondo la x
0 3 <- Ok
0 2 <- Ok
0 1 <- Ok   (punto z)
esco <- Ok
1 1 <- Siccome prima di uscire, era al punto z, la i si incrementa e la x ri
mane com'è (punto z1)
esco <- Ok
1 2 <- Siccome prima di uscire era al punto z1, la i si incrementa e la x ri
mane com'è
0 1 <- Che cavolo centra???   E da qui in poi mi sono perso.
esco
1 1
esco
1 3
0 2
0 1
esco
1 1
esco
1 2
0 1
esco
1 1
esco
Potreste spiegarmi?
Grazie
--
Luigi
byte...@hotmail.com
http://web.tiscali.it/luigi_web
ICQ #46240443

Potreste spiegarmi?
Dire che ci siamo.
-- 
Andrea Laforgia - walkietalkie(at)
libero.it


... snip code and output
Perche' hai sbagliato a seguire i tuoi "punti z".
Prova a "instrumentare" il codice in maniera completa.
Prova con questo codice:
void showNesting(int nest)
{
 std::cout << nest << ") ";
 while ( nest-- )
  std::cout << " ";
 std::cout << ":";
}
void pippo (int x, int nest=0) {
 showNesting(nest);
 std::cout << " --> pippo(" << x << ")" << std::endl;
 if (x == 0) {
  showNesting(nest);
  std::cout << "esco" << std::endl;
 } else {
  for (int i = 0; i < 2; i++) {
   showNesting(nest);
   std::cout << i << " " << x << std::endl;
   showNesting(nest);
   std::cout << " ! pippo(" << x << ") chiama pippo(" << x-1 << ")" <<
std::endl;
   pippo (x - 1, nest+1);
   showNesting(nest);
   std::cout << " ! ritorno a pippo(" << x << ")" << std::endl;
  }
 }
 showNesting(nest);
 std::cout << " <-- pippo(" << x << ")" << std::endl;
}
int main () {
 pippo (3);
 std::cout.flush();
 return 0;
}
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 Dire che ci siamo.
Non sono d'accordo :(



Qui l'output è ancora più confusionario.


Ho fatto un po di prove... quello che non capisco è cosa succede dopo
l'uscita dalla funzione.. cioé a chi viene passato il controllo.


Non sono d'accordo :(
Dai, sforzati e ci arrivi ;)


l'uscita dalla funzione.. cioé a chi viene passato il controllo.
Il richiamo di una funzione ricorsiva e' come quello di
qualunque altra funzione: viene restituito il controllo al
punto successivo della funzione chiamante.



Vedila cosi':
PIPPO(0) genera:
    ESCO
    (ritorno al chiamante)
PIPPO(1) genera:
    0 - 1
    (chiamata a Pippo(0)
    1 - 1
    (ritorno al chiamante)
PIPPO(2) genera:
    0 - 2
    (chiamata a Pippo(1))
    1 - 2
    (ritorno al chiamante)
PIPPO(3) genera:
    0 - 3
    (chiamata a Pippo(2))
    1 - 3
    (ritorno al chiamante)
Ora se parti da quest'ultimo punto (chiamata di PIPPO(3)) ottieni
    0 - 3
       0 - 2
          0 - 1
             esco
          1 - 1
             esco
       1 - 2
etc. etc.
che e' proprio quello che ottieni tu.
PIPPO(3) GENERA:
0 - 3 ==> chiama PIPPO(2)
     0 - 2 ==> chiama PIPPO(1)
PIPPO(2) GENERA
     0 - 2 ==> chiama PIPPO(1)
-- 
Posted from 
dell-01.mm.eutelsat.org
 [194.214.173.17] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie a tutti, forse ho capito il punto qual'č!
Ciao


 punto successivo della funzione chiamante.
Che in questo caso è come se fosse il precedente, nel senso che "torna
indietro" per continuare il ciclo for oppure (come è giusto che sia) se il
ciclo for è terminato passa al punto successivo innescando il nuovo ciclo
for. (Va bè, è spiegato da cani, però credo tu riesca a seguirmi visto che
hia chiaro l'argomento).
Ciao


 };		<-----
 
A cosa servono?
Cecco

 wrote in message
news:3BB83984...@tin.it...

A nulla. Infatti puoi anche non metterceli.


A nulla. Infatti puoi anche non metterceli.
ad occhio non direi, pippo(x-1) verrebbe chiamata dopo la conclusione
del for e non prima


 del for e non prima
Intendevano i ';'
-- 
Luc.

 del for e non prima
Ad occhio? Quale quello chiuso?
Ripeto anche io i   ";" indicati con "<-----" non servono a nulla!!
Ciao
Gaetano.


 Ripeto anche io i   ";" indicati con "<-----" non servono a nulla!!
se non sbaglio il terzo e' anche errato: in un caso come questo
void f() {
};
il compilatore interpreta il ';' come uno statement nullo, ma al di fuori 
del corpo di una funzione non puo' esserci alcuno statement.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 del corpo di una funzione non puo' esserci alcuno statement.
Puo' essere interpretato come una dichiarazione nulla. Non dovrebbe darti
errore.
--


 errore.
Dovrebbe essere uno statement vuoto e' come se tu scrivessi
void f() {
};;;;;;;;;;;


 errore.
hai ragione; sono andato a controllare la grammatica e sia il nome del tipo 
che gli identificatori sono opzionali; anche se non capisco a cosa possa 
servire...


anche se non capisco a cosa possa servire...
Non sempre c'e' uno scopo, si tratta anche si semplice
coerenza del linguaggio.
