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)??
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.
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);