Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- rekursiv (http://www.informatikerboard.de/board/thread.php?threadid=1984)


Geschrieben von neuling96 am 05.12.2014 um 18:53:

  rekursiv

Was gibt folgendes (rekursive) Programm auf dem Bildschirm aus?
import IOulm.*;
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);
}
}

Beim ersten durch lauf nach obscure(3, 4)-> wird zu obscure(4, 2)??

Ich versteh nicht wie das überhaupt funktioniert



Geschrieben von eulerscheZahl am 05.12.2014 um 19:26:

 

Zitat:
Beim ersten durch lauf nach obscure(3, 4)-> wird zu obscure(4, 2)

richtig!

und welcher Aufruf folgt dann aus obscure(4, 2)?

Und wie sieht es mit der Ausgabe aus?
Das x wird oberhalb des rekursiven Aufrufs schon ausgegeben, das y erst danach.
Folglich werden erst alle x-e aus obscure(x, y) ausgegeben - und zwar in der Reihenfolge, wie die Funktion aufgerufen wird.
Anschließend werden die y in umgekehrter Reihenfolge ausgegeben.



Geschrieben von neuling96 am 05.12.2014 um 19:31:

 

obscure(3, 4)-> wird zu obscure(4, 2)->obscure(3,2)->obscure(2,2)

Aber nach obscure(2,2)
Write.Line("x: "+x);

Also x=2?



Geschrieben von eulerscheZahl am 05.12.2014 um 19:41:

 

Bei obscure(2,2) wird ja schon abgebrochen, bevor es zur Ausgabe kommt.
Aber von den obscure davor ist jeweils noch ein x auszugeben, bevor überhaupt der rekursive Aufruf zustande kommt. Und danach eben in umgedrehter Reihenfolge das y.

Ich habe das Programm etwas modifiziert, damit ich zusätzlich noch erfahre, von welchem Funktionsaufruf die Ausgabe stammt.
Der Anfang sieht so aus:
code:
1:
2:
3:
x: 3 von obscure(3,4);
x: 4 von obscure(4,2);
x: 3 von obscure(3,2);

wie geht es weiter?



Geschrieben von neuling96 am 05.12.2014 um 19:49:

 

dann für y:
y: 2
y: 2
y: 4



Geschrieben von eulerscheZahl am 05.12.2014 um 19:49:

 

passt Daumen hoch



Geschrieben von neuling96 am 05.12.2014 um 20:01:

 

danke Wink


Forensoftware: Burning Board, entwickelt von WoltLab GmbH