Hallo,
es geht um die Ausgabe folgendes Programms:
Java:
publicclassAufg5{staticString a ="";publicstaticvoid f (int i ){System. out . println ( i );if( i >0){
a = a +"<";
f ( i-1);
a = a +">";}else{
a = a +"+";}}publicstaticvoid main (String[] args ){
f (3);System. out .println ( a );}}
Also erstmal ist klar, dass zeilenweise 3 2 1 0 ausgegeben wird. Dann ist mir auch klar, dass <<<+ ausgegen wird, jedoch nicht warum auch noch >>> ?
Die Methode ruft sich doch immer wieder selbst auf und fängt immer bei f(i-1) von vorne an nur um 1 verringert. Im Fall, wo sie Null ist kommt dann noch, das + dazu, aber woher kommt das >>>?
Die Methode ruft sich doch immer wieder selbst auf und fängt immer bei f(i-1) von vorne an nur um 1 verringert. Im Fall, wo sie Null ist kommt dann noch, das + dazu, aber woher kommt das >>>?
Wenn f(0) abgearbeitet wurde, ist die Programmausführung noch nicht abgeschlossen, sondern es wird an die Stelle zurück gesprungen, an der f(0) aufgerufen wurde. Am besten spielst du es mal als Schreibtischtest bis zum Ende durch.
Das Problem liegt in dem zweiten Fall der Bedingung. Sprich ist i kleiner gleich 0, wird a=a + "+" gerechnet.
Warum das ausgegeben wird sollte somit eigentlich klar sein: In deiner Hauptmethode lässt du a ausgeben und durch die vorhergegangenen Additionen bekommst du <<<+>>> ausgegeben.
Wenn du die Methode wieder neu aufrufst über f(i-1), bleibt die Methode da erstmal stehen... Ist i dann irgendwann kleiner gleich 0, wird durch den selbstaufruf aber erst der zweite Ausgang der Bedingung a =a+ "+" berechnet. Anschließend wird mit den Rechnungen a = a+ ">" weiter verfahren, sodass eben diese Ausgabe zustande kommt. Rufst du die Methode in der Hauptmethode mit dem parameter 4 auf, so wirst du 4 größer und kleiner zeichen jenseits des "+" sehen...
Mir ist das nicht klar.
Ich ruf die Methode auf für i=3. Es geht dann bis zur Stelle f(2). Danm geht es doch wieder von vorne los also mit system.out.println(2) und wieder bis f(1) usw.
Oder liege ich da schon falsch?
Nein, die Methode wird erneut aufgerufen. Es gibt in diesem Beispiel also vier ineinander geschachtelte Aufrufe von f(). Eine durch einen Methodenaufruf unterbrochene Abarbeitung wird nach Rückkehr aus der Methode einfach fortgesetzt.
Das + wird während der Abarbeitung von f(0) angehängt. Dann ist der Aufruf von f(0) fertig und die unterbrochene Ausführung von f(1) wird nach der Zeile f(i-1);fortgesetzt. Es wird also ein > angehängt. Dann ist die Ausführung von f(1) beendet und die unterbrochene Ausführung von f(2) wird nach der Zeile f(i-1);fortgesetzt ...
Was wäre denn alternativ denkbar? Das ist die natürliche Ausführungsreihenfolge. Bei nicht-rekursiven Methoden ist es doch auch so, dass es nach deren Aufruf dort weiter geht, wo der Aufruf statt fand. Warum sollte das bei rekursiven Methoden anders sein? Ich empfehle dir noch einmal, das in einem Schreibtischtest komplett durchzuspielen.
Ok also dann ist es doch so:
Zuerst ist i=3. Dann wird 3 ausgegeben und in a ein < gespeichert. Dann wird f(2) aufgerufen, 2 ausgegen und in a wieder < gespeichert usw bis f(0) kommt, dann wird 0 ausgeben. Danach geht es mit der Stelle f(0) weiter, also dort wo die Abarbeitung "stehen geblieben" war. Dann kommt zu a ein >. Dann ist geht es weiter mit f(1), denn dort war ja auch unterbrochen, wieder ein > und das gleiche mit f(2). Danach ist man fertig, da nur die Schritte für i-1 unterbrochen wurden oder?
Ich danke dir. Das habe ich endlich verstanden Danke vielmals
Ich hätte noch kurz eine andere Frage. Wenn ich ein Klass Ober habe und Unter, die von Ober erbt. Ich erzeuge ein Objekt von Unter mit Typ Ober. Dann ist ja klar, dass überschriene Methoden des dynamischen Typs unter gerufen werden.
Wenn ich jetzt eine Methode g() in der Oberklasse habe(gibt es nur dort), die in g eine Methode f() aufruft, die von Unter überschrieben wird , wird dann erst die Methode g aufgerufen aus Ober, da es diese nirgendwo anders gibt und dann f in der Unterklasse aufgerufen?
Ja habe ich und so ist es auch.
Ist es dann allgemein immer so, wenn ich ein Objekt der Unterklasse habe vom Typ der Oberklasse und eine Methode aufrufe die nur in der Oberklasse existiert, dann wird diese nur aufgerufen, weil man referenz vom typ der Oberklasse ist?