JAVA, Hilfe bei Übungsaufgabe aus DVP-Seminar

Algorithmus, Baumdurchlauf, Compiler, Interpreter...; Cobol, Pascal, C/C++, Java & Co.
Antworten
Willi
Forums-Profi
Forums-Profi
Beiträge: 210
Registriert: 24.02.03 13:56

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
Martin0815
Forums-Scout
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:

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());
} 
Die StringBuilder-Klasse existiert erst ab Java 1.5!!!
Martin0815
Forums-Scout
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:

Code: Alles auswählen

System.out.print (i%10);
ausgabe2(i/10);
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.

Code: Alles auswählen

ausgabe2(i/10);
System.out.print (i%10);
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!
Willi
Forums-Profi
Forums-Profi
Beiträge: 210
Registriert: 24.02.03 13:56

Hallo Martin,
jetzt wo es da steht, ist es einfach. Aber wenn mein Hirn in der DVP genauso verammelt ist wie vorhin, na dann gute Nacht :roll:
Vielen Dank für Deine Hilfe
Gruß
Willi
Martin0815
Forums-Scout
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...
Antworten