Java Schnalle meinen Code nicht (Rekursion)

Regidür

Ensign
Registriert
Okt. 2013
Beiträge
180
Moin, ich schnalle gerade meinen eigenen Code zum Thema Rekursion nicht:

Code:
public static int unterprogramm(int zahl) {
  int ergebnis = zahl;
       
    if (1<=ergebnis) {
        
        ergebnis = unterprogramm(zahl-1);
              System.out.println(zahl + " ");
                
    }
   

   return ergebnis;

Wenn zahl = 10 ist, dann gibt er "1 2 3 ...10" aus, ich versteh aber überhaupt nicht wieso. Wie läuft er das ganze durch und wieso fängt er mit 1 an?
Danke für die Hilfe.
 
Na, weil du ihm das hier sagst O.o?

Code:
 if (1<=ergebnis) {
        
        ergebnis = unterprogramm(zahl-1);
              System.out.println(zahl + " ");

Du hast es doch programmiert, naja, zumindest sagst du das ;)
 
Warum?

Nun, weil eine Rekursion immer von "hinten nach vorne" läuft.

Die Rekursion baut zuerst den Stack auf. Erst beim Abbauen des Stacks werden die Operationen ausgeführt. Daher beginnt er mit 10.

Greetz
hroessler
 
Sei zahl = 10.
Dann wird dein Print-Out(10) erst aufgerufen, nachdem dein Unterprogrammaufruf "unterprogramm(9) vollständig abgearbeitet ist.
Und unterprogramm(9) returniert erst, nachdem es selbst Print-Out(9) aufgerufen hat, usw. -> d.h. print-out(9) wird vor print-out(10) aufgerufen und so weiter.

Gruß Timo
 
@Scholle
Ich habs wirklich programmiert, hab mich an den bisherigen Beispielen zu dem Thema Rekursion orientiert und dann ein bisschen rumprobiert. Ist so :D Aber weil ich eben nur rumprobiert habe, verstehe ich nicht, wieso es funktioniert.



Wenn ich es so mache
Code:
public static int unterprogramm(int zahl) {
  int ergebnis = zahl;
   System.out.println(zahl);    
    if (1<=ergebnis) {
        
        ergebnis = unterprogramm(zahl-1);
              System.out.println(zahl + " ");
                
    }
   
 
   return ergebnis;
dann zählt er erst runter - das verstehe ich. Aber wieso er danach wieder hochzählt, schnall ich einfach nicht :(
 
das programm wird ja linear abgearbeitet. das heißt auf einen stapel kommen alle programm anweisungen, die dann von oben nach unten abgearbeitet werden. http://de.wikipedia.org/wiki/Stapelspeicher

wenn du das erste mal unterprogramm(10) aufrufst, dann ruft dieses in Zeile 6 sich selbst wieder auf mit unterprogramm(9) und jetzt kommt der Punkt: Solange unterprogramm(9) nicht fertig ist, wird Zeile 7 in Unterprogramm(10) nicht ausgeführt.

Das heißt das Programm steigt bis zu unterprogramm(0) (das ist das erste welches tatsächlich bis zum return ergebnis durchläuft) ab und dann können aufsteigend alle anderen unterprogramme weiter abgearbeitet werden wobei jeweils den Wert von zahl ausgeben wird.
 
Zuletzt bearbeitet:
unterprogramm(10) ruft unterprogramm(9) auf, das widerum unterprogramm(8) usw. Da unterprogramm(1) als letzter Aufruf der Kette als erstes println(zahl), konkret println(1), ausführt, erhälst du die Ausgabe 1, gefolgt von der nun ausgeführten Zeile println(2) innerhalb des Aufrufs unterprogramm(2) usw.

Vielleicht solltest du dir ein Diagramm zeichnen, verbildlicht lässt sich die ohnehin schon simple Rekursion tadellos nachvollziehen.
 
Zuletzt bearbeitet von einem Moderator:
Falls deine IDE / Debugger das kann: Lass dir mal das Programm Zeile für Zeile (mit manuellem weitergehen / Einzelschritt) vorspielen. Das sollte mehr erklären als 1000 Worte.
 
Nilson schrieb:
Falls deine IDE / Debugger das kann: Lass dir mal das Programm Zeile für Zeile (mit manuellem weitergehen / Einzelschritt) vorspielen. Das sollte mehr erklären als 1000 Worte.

sehr gute idee, wenn er das richtig bedienen kann!
 
@Nilson
Benutze momentan Notepad...Aber wenn sowas geht, was du da sagst, lad ich mir mal Eclipse runter.
 
wenn du dein Beispiel mit 10 beginnst, wird deine Rekursion erst 10 mal hintereinander ausgeführt
Code:
ergebnis = unterprogramm(zahl-1);
Erst nach dem letzten Durchlauf, wird dann zum ersten Mal ein Ergebnis ausgegeben
Code:
System.out.println(zahl + " ");


Würde ich die Reihenfolge deines Codes so ändern:
Code:
System.out.println(zahl + " ");
ergebnis = unterprogramm(zahl-1);
hätte ich die Reihenfolge der Ausgabe umgedreht: 10 9 8 7 6 5 4 3 2 1
 
Eclipse sollte das können.
 
Eclipse, Netbeans, IntelliJ...alles besser als Notepad
Ich kann mir kaum vorstellen, dass ihr an ner Uni Notepad benutzt xD was soll das denn? :D
 
Regidür schrieb:
@aroxx
Wieso? An der Uni benutzen wir halt nur Notepad^^

Ist auch fuer das erste Semester nicht schlecht. Man lernt schnell die Grundlagen auswendig und ist gezwungen sich näher mit dem Code zu beschäftigen. Eclipse und IntelliJ etc nehmen einem doch ne Menge ab. Merkt man erst, wenn man ne zeit lang damit arbeitet.
Ich habe selbst das ganze erste Semester nur mit dem JavaEditor oder Notepad gearbeitet und bin dann im zweiten Semester auf IDEA umgestiegen.
 
e_Lap schrieb:
Ist auch fuer das erste Semester nicht schlecht. Man lernt schnell die Grundlagen auswendig und ist gezwungen sich näher mit dem Code zu beschäftigen. Eclipse und IntelliJ etc nehmen einem doch ne Menge ab. Merkt man erst, wenn man ne zeit lang damit arbeitet.
Ich habe selbst das ganze erste Semester nur mit dem JavaEditor oder Notepad gearbeitet und bin dann im zweiten Semester auf IDEA umgestiegen.

man könnte vielleicht trotzdem zumindest mit vim oder emacs (nein ich will keine diskussion starten :D) anfangen... das nützt einem dann immer was.
 
Zurück
Oben