Newsgroup: it.comp.java
Titolo: Incredibile ricorsione

Premetto che dell'argomento in oggetto devo sapere solo cosa un codice
in ricorsione genera come output, quindi:
public class Compito
{
  static int f (int x)
  {
    System.out.println(x);
    if (x>=2) return 2*f(x-1)+g(x-2);
       else return 3;
  }
  static int g (int x)
  {
    if (x>1)
    {
      int s=1;
      s+=3+f(x-1)+g(x-3);
      return s;
    }
    else return 3;
  }
  public static void main (String [] args)
  {
    System.out.println(f(3));
  }
}
Perchè l'output è 21 e non 15 ?
per favore aiutatemi (non è elimosinare come dicono alcuni) se riesco
a capire la ricorsione supero il compito (devo fare tutti gli esercizi
esatti).
Con il fattoriale ero convinto di avere capito cosa fosse la ricorsione
ma mi sbagliavo.
Come ho ragionato io:
prendo il 3 ed entro in f, 3>=2 ? Vero quindi mi richiamo f con il
valore 2, e ancora 2>=2 rientro e me lo chiamo con il valore 1 e a
questo punto 1>=2 è falsa perciò cosa faccio(qui mi confondo):
moltiplico 2*1 il risultato per 2 e poi per 3 e ottengo 12, poi passo
alla funzione g chiamandomela con 3-2 cioè 1 ed entrando vedo che è
falsa e quindi ritorna 3, quindi 12+3 = 15 perchè non risulta ?

A occhio e croce direi che la funzione g viene chiamata quattro volte,
non una sola

 falsa e quindi ritorna 3, quindi 12+3 = 15 perchè non risulta ?
No -_-;
Prova a ragionare per passi:
f(3) 3>=2? risultato = 2 * f(2) + g(1)
f(2) 2>=2? risultato = 2 * f(1) + g(0)
f(1) 1>=3? risultato = 3
poi procedi a calcolare anche la funzione g
g(1) 1>1? risultato = 3
g(0) 1>1? risultato = 3
E quindi ottieni:
f(2) = 2 * 3 + 3 = 9
f(3) = 2 * 9 + 3 = 21
Risultato 21.
Saluti
CarMas

 questo punto 1>=2 è falsa perciò cosa faccio(qui mi confondo):
quando sarai piu' pratico della ricorsione magari ti potrai permettere di
risolvere un problema con questo metodo ma fino ad allora ti consiglio di
rosolvere come riportato sotto..
[..]
f(3) = 2 * f(2) + g(1)
risolvi i valori che non conosci..
f(2) = 2 * f(1) + g(0)
g(1) = 3
risolvi i valori che non conosci..
f(1) = 3
g(0) = 3
quindi..
f(3) = 2 * (2 * 3 + 3) + 3 = 21
-- 
www.iuz-lab.info

 writes:
0001 public class Compito
0002 {
0003 
0004   static int f (int x)
0005   {
0006     System.out.println(x);
0007     if (x>=2) return 2*f(x-1)+g(x-2);
0008        else return 3;
0009   }
0010 
0011   static int g (int x)
0012   {
0013 
0014     if (x>1)
0015     {
0016       int s=1;
0017       s+=3+f(x-1)+g(x-3);
0018       return s;
0019     }
0020     else return 3;
0021   }
0022 
0023   public static void main (String [] args)
0024   {
0025     System.out.println(f(3));
0026   }
0027 
0028 }
A> prendo il 3 ed entro in f, 3>=2 ? Vero quindi mi richiamo f con il
A> valore 2, e ancora 2>=2 rientro e me lo chiamo con il valore 1 e a
A> questo punto 1>=2 è falsa perciò cosa faccio(qui mi confondo):
A> moltiplico 2*1 il risultato per 2 e poi per 3 e ottengo 12, poi
A> passo
Cosa diamine succede  quando il test di uno statement if  è falso ed è
presente una parte else ????????? O per caso qualcuno avanza l'ipotesi
che l'else di linea 8 sia  lì per zavorrare il codice che altrimenti è
sbilanciato ?
Fare  attenzione  al  testo  che  il docente  si  diverte  a  seminare
trappole.
"la comprensione del testo di esame  fa parte del superamento della
prova" 
(S. Congiu, prof. di Calcolatori Elettronici al DEI, Padova)
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione