Forum: PC-Programmierung kleines Java Problem


von Andi (Gast)


Lesenswert?

Hallo Zusammen,

Ich steh gerade sowas von auf dem Schlauch und hoffe hier kann mir einer 
kurz weiterhelfen.

Folgender Java Quellcode liegt vor:
1
public void DasBesteKommtAmSchluss()
2
{
3
  JimKnopf(13);            
4
  System.out.println("Beste");
5
}
6
public void JimKnopf(int Zahl)
7
{
8
  if (Zahl > 10)          
9
  {
10
    System.out.print(Zahl);    
11
    JimKnopf(Zahl-1);      
12
    System.out.println(Zahl);
13
  }
14
}

Ausgegeben wird:
13121111
12
13
Beste

Klar ist mir die 131211 aber bitte wieso erneut 11?
Jimknopf(11-1) wird ja übergeben und dann ist die if Bedingung nichtmehr 
erfüllt.

ich hoffe ihr wisst was ich meine.

Beste Grüße

: Verschoben durch Admin
von Noname (Gast)


Lesenswert?

>Klar ist mir die 131211 aber bitte wieso erneut 11?
Weil die als Parameter übergebene Zahl, also auch die 11 zweimal 
ausgegeben wird. Einmal vor dem Aufruf von JimKnopf und einmal nach dem 
Aufruf.

von Andi (Gast)


Lesenswert?

wenn das so ist muss doch auch zweimal die 13 oder 12 ausgegeben werden?

von Noname (Gast)


Lesenswert?

>wenn das so ist muss doch auch zweimal die 13 oder 12 ausgegeben werden?

Ja. Wird ja auch.

13    1. 13
12    1. 12
11    1. 11
11    2. 11
12    2. 12
13    2. 13

von Andi (Gast)


Lesenswert?

bis jetzt steh ich immernoch auf dem Schlauch.
Ich kann mich zwar damit anfreunden das JimKnopf(10) keine verwendung 
findet und deshalb das Programm auf die nächste Zeile läuft und die 
zweite 11 ausgibt mit Zeilenumbruch.
Aber bitte woher kommt nun die 12 und 13.

von Martin M. (capiman)


Lesenswert?

Baud Dir mal folgendes ein (1. println),
dann siehst du den Ablauf besser:

public void JimKnopf(int Zahl)
{
  System.out.println("JimKnopf("+Zahl+")");
  if (Zahl > 10)
  {
    System.out.print(Zahl);
    JimKnopf(Zahl-1);
    System.out.println(Zahl);
  }
}

von xunil (Gast)


Lesenswert?

Wegen der Rekursion.
Solange die Zahl größer 10  ist, ruft die Methode sich selbst auf. Nach 
Ausgabe der 11 bricht die Rekursion ab, die eine Tiefe von drei erreicht 
hat. (13,12,11). Nach jedem Rücksprung aus einer Rekursionsebene wird 
das nachgelagerte println aufgerufen, welches den aktullen Paramter beim 
Aufruf der Funktion ausgibt, also 11, 12 und 13.

Mfg

von Andi (Gast)


Lesenswert?

danke jetzt steh ich nichtmehr auf dem Schlauch :D

von XTerminator (Gast)


Lesenswert?

Im ersten Schleifendurchlauf gibst du aus (ich lasse die Zeilenumbrüche 
mal der Einfachheit wqeg):

13, alles aus dem rekursiven Aufruf, nochmal 13.

"alles aus dem rekursiven Aufruf" ist aber:

12, alles aus dem nächsten rekursiven Aufruf, 12

Also haben wir bis hier:

13, 12, alles aus dem nächsten rekursiven Aufruf, 12, 13

Der "nächste rekursive Aufruf" ist:

11, alles aus dem übernächsten rekursiven Aufruf, 11

Eingesetzt:

13, 12, 11, "alles aus dem übernächsten rekursiven Aufruf", 11, 12, 13

"Alles aus dem übernächsten rekursiven Aufruf" ist leer, weil Zahl nun 
10 ist.

Eingesetzt:

13, 12, 11, 11, 12, 13

von Klaus (Gast)


Lesenswert?

Und wenns dann funktioniert, portierst du das auf VHDL, oder wie?

von Noname (Gast)


Lesenswert?

Ich habe absichtlich zwar richtige, aber nur direkt auf Deine Frage 
eingehende Antworten gegeben. Denn Du lernst aus Deinen eigenen Fragen 
mehr.

Deine Rückfrage auf meine erste Antwort deutet darauf hin, das Du noch 
andere Verständnisprobleme hast, die nichts mit Rekursion zu tun haben, 
Dir aber das Verständnis derselben schwer machen.

>Ich kann mich zwar damit anfreunden das JimKnopf(10) keine verwendung
>findet ...
Wenn man über Programmtexte redet spricht man vonm sog. "aufrufen" 
(engl. call).
Die Funktion JimKnopf wird durchaus mit dem Parameter 10 "aufgerufen". 
Ob dies geschieht hängt ja davon ab, ob die Bedingung des if wahr ist. 
Für den Wert 11 ist sie wahr. Also wird JimKnopf aufgerufen.
Das dann die Bedingung während des erneuten Aufrufs mit 10 falsch ist 
und faktisch nichts geschieht, heisst nicht, das dann alternativ die 
auf den Aufruf folgende Anweisung ausgeführt wird.
Grundsätzlich werden Anweisungen in der Reihenfolge, in der sie im 
Programmtext auftreten ausgeführt und zwar unabhängig davon ob etwa der 
Rumpf einer Funktion die zuvor ausgeführt wurde im Effekt leer war oder 
nicht.
Das aber ist eine grundlegendere Eigenschaft aller Programme dieses Typs 
von Programmiersprachen. Diese solltest Du aus Programmen wie
1
GibWasAus (int Alter)
2
{
3
   if (Alter > 48)
4
      printf ("alter");
5
}
6
7
main ()
8
{
9
   int Alter;
10
   printf ("Gib bitte Dein Alter ein!");
11
   fscanf ("%d", &Alter);
12
   printf ("Hallo Du");
13
   GibWasAus (Alter);
14
   printf ("Sack");
15
}
schon kennen.
Auch wenn die Funktion GibWasAus je nach eingegebenem Alter nicht 
ausgibt wird dennoch das nachfolgende printf ("Sack") ausgeführt.

Damit ist dieser Satz
> ...und deshalb das Programm auf die nächste Zeile läuft und die...
insofern falsch weil die nächste Zeile nicht "deshalb" sondern immer und 
grundsätzlich ausgeführt wird.

>Aber bitte woher kommt nun die 12 und 13.
Daher kommt dann auch die zweite 12 und 13.

Das Thema Rekursion ist ein ganz klein wenig Gehinrverbiegerisch und 
sollte deswegen besser "erlebt" als "erklärt" werden. Offen gesagt 
glaube ich nicht, das Du es aus der oben gegebenen Erklärung verstanden 
hast, aber ich mag mich irren.

von Fetz (Gast)


Lesenswert?

Und immer dran denken:

Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.