# Rekursion Handsimulation



## LokenID (20. Jul 2011)

Hallo, 

folgender Code: 


```
public class Obscure{
public static void obscure(int x, int y){
if (x*y<=4)
return;
Write.Line("x: "+x);
if (x>=y)
obscure(x-1, y);
else
obscure(y, x-1);
Write.Line("y: "+y);
}
public static void main(String[] args){
obscure(3, 4);
}
}
```

Aufgabe ist nachzuvollziehen was der Code macht.  Soweit komm ich:
x:3
x:4
x:3

dann komm ich mit 2,2 zur ersten if-Bedingung. Durch Return brech ich die Schleife ab und dann? 
???:L


----------



## ARadauer (20. Jul 2011)

> Durch Return brech ich die Schleife ab und dann?


dann gehts dort weiter wo dieses obscure das gerade läuft aufgerufen wurde. Also konkret im dritten (oder je nach dem wie oft schon) Aufruf in der Zeile 10. dann ist diese methode fertig, dann läuft der zweite Aufruf in der zeile 10, dann der erste

also
y:irgendwas
y:irgendwas
y:irgendwas
...
bis if (x*y<=4)
x:irgendwas
x:irgendwas
x:irgendwas
x:irgendwas


----------



## SlaterB (20. Jul 2011)

@ARadauer
x und y vertauscht


----------



## ARadauer (20. Jul 2011)

ähmn ja... feif: war Absicht, wollte schaun ob wer mitdenkt...

Vielleicht noch ein Tipp von mir: Sauber einrücken, überall Klammern machen und ein par Ausgaben noch rein und das ganze ist viel besser nach zu vollziehen...


```
public class Obscure
{
    public static void obscure(int x, int y, int aufruf)
    {
        System.out.println("rein in Aufruf: " + aufruf);
        if (x * y <= 4)
        {
            System.out.println("raus aus aufruf: "+aufruf);
            return;
        }
        System.out.println("x: " + x);
        if (x >= y)
        {
            obscure(x - 1, y, aufruf + 1);
        }
        else
        {
            obscure(y, x - 1, aufruf + 1);
        }
        System.out.println("y: " + y);
        System.out.println("raus aus aufruf: "+aufruf);
    }

    public static void main(String[] args)
    {
        obscure(3, 4, 1);
    }
}
```


----------



## LokenID (20. Jul 2011)

ups die ging beim kopieren verloren

wo du es erwähnst seh ich auch wo mein Fehler war. Ich war der Meinung die write.line y gehört speziell zum else Fall, tut sie aber gar nicht  
Danke


```
public class Obscure{
     public static void obscure(int x, int y){
       if (x*y<=4)
            return;
       Write.Line("x: "+x);
       if (x>=y)
           obscure(x-1, y);
       else
          obscure(y, x-1);
      Write.Line("y: "+y);
}

 public static void main(String[] args){
      obscure(3, 4);
 }
}
```


----------

