Hallo,
wir haben in unserem DVP-Seminar ein paar Übungsaufgaben bekommen. Bei einer komme ich nicht weiter:
Die beiden folgenden Methoden erlauben die Ausgabe eines int-Wertes durch den Aufruf von z.B.: ausgabe (1425); , jedoch in umgekehrter Reihenfolge 5241.
1 void ausgabe (int i)
2 {if(i == 0) System.out.print(i);
3 else ausgabe2(i);
4 }
5
6 void ausgabe2 (int i)
7 {if (i == 0) return;
8 System.out.print (i%10);
9 ausgabe2 (i/10); //Rekursion !!
10 }
Wie kann durch Veränderung in der Methode ausgabe2 erreicht werden, dass die Ziffern in richtiger Reihenfolge ausgegeben werden?
Kann mir da bitte jemand helfen? Ich blicks einfach nicht.
Danke
Gruß
Willi
JAVA, Hilfe bei Übungsaufgabe aus DVP-Seminar
-
- Forums-Scout
- Beiträge: 374
- Registriert: 23.09.04 15:43
- Kontaktdaten:
Ich vermute mal, dass es so nicht unbedingt gedacht ist. Aber folgende Methode (nicht-rekursiv) löst das Problem jedenfalls:
Die StringBuilder-Klasse existiert erst ab Java 1.5!!!
Code: Alles auswählen
static void ausgabe2 (int i)
{
if (i == 0) return;
// Integerobjekt anhand der übergebenen Zahl erzeugen
Integer i_i = new Integer(i);
// Stringobjekt aus Integerobjekt erzeugen
String s_i = i_i.toString();
// StringBuilderobjekt aus Stringobjekt erzeugen
StringBuilder sb_i = new StringBuilder(s_i);
// StringBuilderobjekt in umgekehrter Reihenfolge ausgeben
System.out.print (sb_i.reverse());
}
-
- Forums-Scout
- Beiträge: 374
- Registriert: 23.09.04 15:43
- Kontaktdaten:
Die eigentliche Aufgabe ist aber rekursiv zu lösen.
Die Lösung ist eigentlich absolut trivial. Allerdings habe ich es halt (siehe oben) auch erstmal mit der seltsamen StringBuilderklasse gelöst was ja nicht Sinn und Zweck der Übung war.
Eigentlich geht es nur darum zu verstehen, wie eine Rekursion abläuft.
Innerhalb der Methode ausgabe2 gibt es die beiden Zeilen:
Dort wird erstmal die letzte Ziffer ausgegeben und danach die Rekursion mit der entsprechenden Zahl (ohne diese letzte Ziffer) gestartet, dadurch wird als nächstes die vorletzte Ziffer ausgegeben usw.
Wenn man die Ausgabezeile einfach hinter die Rekursion legt, dann ist die Aufgabe gelöst. In diesem Fall wird erst die ganze Rekursion durchlaufen bis die übergebene Zahl 0 geworden ist.
Erläuterung:
Die Rekursion läuft prinzipiell genauso ab wie bei der 1. Variante. Nur wird hier nicht die letzte Ziffer ausgegeben, da davor ja die Rekursion (mit der Zahl ohne die letzte Ziffer) durchgeführt wird. Wenn die Zahl 0 geworden ist, wird keine neue Rekursion durchlaufen sondern der innerste Aufruf der Methode ausgabe2 beendet. Nun kehrt das Programm eine Rekursionsebene höher in die Metzhode ausgabe2 in die Ausgabezeile nach dem Rekursionasaufruf zurück (d.h. nur eine einstellige Zahl wurde übergeben). Diese einstellige Zahl entspricht der ersten Ziffer der übergebenen Zahl und wird nun ausgegeben. Danach gelangt man wieder eine Rekursionsebene höher und es wird die nächste Ziffer ausgegebene usw.
Das bedeutet der String wird in der korrekten Reihenfolge ausgegeben!!!
Wer da immer noch Probleme hat, sollte das Ganze mal im Debugger nachvollziehen., Einfach vor und nach der Rekursion Breakpoints setzen undbeide Varianten mal debuggen. Dann kann man den Unterschied der beiden Varianten sehen!
Die Lösung ist eigentlich absolut trivial. Allerdings habe ich es halt (siehe oben) auch erstmal mit der seltsamen StringBuilderklasse gelöst was ja nicht Sinn und Zweck der Übung war.
Eigentlich geht es nur darum zu verstehen, wie eine Rekursion abläuft.
Innerhalb der Methode ausgabe2 gibt es die beiden Zeilen:
Code: Alles auswählen
System.out.print (i%10);
ausgabe2(i/10);
Wenn man die Ausgabezeile einfach hinter die Rekursion legt, dann ist die Aufgabe gelöst. In diesem Fall wird erst die ganze Rekursion durchlaufen bis die übergebene Zahl 0 geworden ist.
Code: Alles auswählen
ausgabe2(i/10);
System.out.print (i%10);
Die Rekursion läuft prinzipiell genauso ab wie bei der 1. Variante. Nur wird hier nicht die letzte Ziffer ausgegeben, da davor ja die Rekursion (mit der Zahl ohne die letzte Ziffer) durchgeführt wird. Wenn die Zahl 0 geworden ist, wird keine neue Rekursion durchlaufen sondern der innerste Aufruf der Methode ausgabe2 beendet. Nun kehrt das Programm eine Rekursionsebene höher in die Metzhode ausgabe2 in die Ausgabezeile nach dem Rekursionasaufruf zurück (d.h. nur eine einstellige Zahl wurde übergeben). Diese einstellige Zahl entspricht der ersten Ziffer der übergebenen Zahl und wird nun ausgegeben. Danach gelangt man wieder eine Rekursionsebene höher und es wird die nächste Ziffer ausgegebene usw.
Das bedeutet der String wird in der korrekten Reihenfolge ausgegeben!!!
Wer da immer noch Probleme hat, sollte das Ganze mal im Debugger nachvollziehen., Einfach vor und nach der Rekursion Breakpoints setzen undbeide Varianten mal debuggen. Dann kann man den Unterschied der beiden Varianten sehen!
-
- Forums-Scout
- Beiträge: 374
- Registriert: 23.09.04 15:43
- Kontaktdaten:
jo, wobei das auch ne dämliche Frage wäre für ne Klausur ^^
Aber das heisst ja noch lange nicht, dass sowas nicht kommt. Gerade im Klausurstress könnte es sein, dass ich eine Notlösung wie Variante 1 machen würde, weil ich den Wald vor lauter Bäumen nicht sehe ^^ Sowas kann eben auch einem Informatiker passieren...
Aber das heisst ja noch lange nicht, dass sowas nicht kommt. Gerade im Klausurstress könnte es sein, dass ich eine Notlösung wie Variante 1 machen würde, weil ich den Wald vor lauter Bäumen nicht sehe ^^ Sowas kann eben auch einem Informatiker passieren...