Allgemeines Verständnis - Rekursion

mR.fLopPy

Erfahrenes Mitglied
Hallo Leute!

Ich stehe hier vor einem kleinen Problem. Ich habe eine Aufgabenstellung bekommen wo es gilt eine beliebige Zahl vertikal darzustellen. Das Beispiel gilt es natürlich als Rekursion darzustellen und bei mir scheitert es daran dass nur die letzte Zahl ausgegeben wird.

Beispielsweise lese ich 123 aus dann müsste als Lösung folgendes hier stehen:
1
2
3

Ich habe versucht es mittles Modula 10 u. div. 10 zu lösen.

Code:
main
System.out.Println(writeVertical(123));


static int writeVertical(int n) {
int ganzzahl = n / 10;

  if(ganzzahl <= 9) {
    return ganzzahl; }
  else {
   return writeVertical(ganzahl);
  }
}

Mein Lösungsgedanke ist jener, dass wenn die Funktion an der letzten Stelle angekommen ist, kann die letzte Zahl nicht größer als 9 sein, dann sollte diese Zahl zurückgegeben werden und es müsste der Rest der Zahl beachtet werden - sprich 23 und die Funktion mit dieser Zahl erneut alles durchlaufen.

Ich komme aber nicht auf den Punkt wie ich das machen kann, denn bei diesem Beispiel bekomme ich nur die 1. Zahl nämlich 1. Ein kleiner Tipp wäre hilfreich.
 
der dürfte so ga nicht in das if reinspringen
Code:
int ganzzahl = n / 10;

du rechnest dort gerade 123 durch 10, und da kommt 12,3 raus und da du das in einen int speicherst werden die nachkomma stellen abgeschnitten, sprich in ganzzahl steht eine 12

also kommt er ga nicht in dein if rein
 
Hi.

Natürlich bekommst du nur eine Zahl. Deine Funktion liefert ja auch nur eine Zahl / einen Int.

So funktioniert das nicht.

Versuch doch einfach mal die Ausgabe innerhalb der Funktion zu machen. Deine Funktion heißt ja auch writeVertical - aber sie schreibt ja irgendwie nichts... :confused:

Gruß

PS: Zum Anfang würde es ja erstmal ausreichen, die Zahl verkehrt herum vertikal auszugeben.
 
@Pommes: Stimmt, sondern ins "else" mit der verkleinerten Zahl und da wird die selbe Methode nochmals aufgerufen. Beim 3. Aufruf ist die Zahl dann 1 und er kommt ins if und returned den Wert. So funktioniert meines erachtens eine Rekursion. :)

Dennoch hab ich keine Ahnung wie ich das mit der 23 machen soll.

@deep: Du meinst ich soll die Funktion als void machen und ein System.out.println rein packen? Meines erachtens hab bin ich da auf das selbe Ergebnis gekommen, da gen Ende die 23 wieder nicht beachtet wird, aber ich kann es ja mal probieren.
 
Zuletzt bearbeitet:
Auch mit void komme ich auf das selbe Ergebnis. Ich wäre schon glücklich wenn ich wüsste wie man einfach mehr als nur eine Zahl mit einer Rekursion in der Kommandozeile ausgeben kann. Ich hatte zuvor ein beispiel wo nur 3 ausgegeben wurde.

Hier mit Void mein Beispiel:

Code:
static void writeVertical(int n) {
int ganzzahl = n / 10;

  if(ganzzahl <= 9) {
    System.out.println(ganzzahl); }
  else {
   writeVertical(ganzahl);
  }
}
 
Auch mit void komme ich auf das selbe Ergebnis.
Du mußt im else Teil auch eine Ziffer ausgeben. (Tipp: Modulo Operator!)

Gruß

\edit: Tipp 2: Aufbau der Funktion sollte sein:

1. gib die letzte Stelle der Zahl aus.
2. Wenn die Zahl größer als 9 ist, dann rufe die Funktion rekursiv mit der Zahl / 10 auf.
 
Zuletzt bearbeitet:
Herje.. Okay.. Modulo..

Ich hab die Lösung (durch einen Zufall), aber ich versteh das Beispiel nicht. *g* :D

Die korrekte Vertikale ausgabe erfolgt wenn man noch zusätzlich außerhalb der Bedingung ein:

Code:
System.out.println(n%10);

hinzufügt.

Aber es verwirrt mich trotzdem, dass das Beispiel funktioniert, denn es fühlt sich so an als ob es rückwärts ausgegeben wird.

Zunächst wird der 5 ausgegeben, dann darüber die 4 dann darüber 3 und 2.. 1 Jedoch wird von Modulo nicht beachtet deswegen benötigt man für den Fall wo die letzte Zahl kleiner als bzw. gleich 9 ist eine ganzzahl division um die 1. Zahl auszugeben.

Es ergibt für mich eher einen Sinn wenn die Ausgabe dann 5,4,3,2,1 gewesen wär auch wenn 1,2,3,4,5 gefragt ist.
 
Ausgabe verkehrt herum:
Java:
void writeVertical(int number) {
  System.out.println(number % 10);
  if (number > 9) {
    writeVertical(number / 10);
  }
}
Und jetzt richtig rum..
Java:
void writeVertical(int number) {
  if (number > 9) {
    writeVertical(number / 10);
  }
  System.out.println(number % 10);
}
Gruß
 
Hallo,

versuches es doch mal so
Code:
static void writeVertical(int n) {
		

		if ( n / 10== 0) {
			System.out.println(n);
		} else {
			writeVertical( n / 10);
			System.out.println(n % 10);
		}
	}

Wenn eine Zahl / 10 = 0 ist, ist die Zahl einstellig. Wenn nicht, musst du die anderen Stellen ausgeben lassen (writeVertical) und dann musst du die letzte Stelle ausgeben lassen (System.out.println).

Du kannst das einfach mal so sehen.

Jemand möchte von dir, dass du eine Zahl vertikal ausgibt.
Dein Gedankden-Gang:

"Ok. wenn die Zahl einstellig ist, muss ich diese eine Stelle ausgeben.

Wenn dies nicht so ist, weiß ich, wie ich an die letzte Stelle komme. Ich weiß aber nicht wie ich an die anderen Stellen ran komme. Also gebe ich einfach einem anderen, die Zahl um eine Stelle reduziert. Der soll mit dann einfach den Rest machen (Rekursiver Aufruf). Wenn der dann fertig ist, muss ich nur noch die letzte Stelle ausgeben, bei der ich wusste, wie ich diese rausbekomme.
"

Ich hoffe die Erklärung hilft dir etwas.

Gruß

Sascha

EDIT: Die Lösung von deepthroat ist etwas besser. ;-)
 
Zurück