Java: Wie kann ich Array-Werte rekursiv verschieben?

2 Antworten

Eine rekursive Lösung bestände doch auch nur aus dem Weiterreichen von Array und aktuellem Index.

Das heißt, das Programm müsste rückwärts über den String laufen, vom Ende beginnend zum Anfang, entgegen der Richtung, in die verschoben wird. So wird verhindert, dass die Änderungen aus dem vorherigen Schritt gleich wieder überschrieben werden (spiele es mit Zettel und Stift selbst einmal durch).

So sieht die rekursive Methode dazu aus:

private static void moveRight(char[] sequence, int lastIndex) {
  if (1 > lastIndex) {
    return;
  }

  sequence[lastIndex] = sequence[lastIndex - 1];
  moveRight(sequence, lastIndex - 1);
}

Zuerst kommt die Abbruchbedingung, die prüft, ob das Programm schon am Anfang angekommen ist (Index 0). Die erste Stelle hat keinen Vorgänger mehr, mit dem sie ausgetauscht werden könnte. In jedem vorherigen Schritt wird das aktuelle Zeichen mit seinem Vorgänger vertauscht.

Verbildlichung also für einen Teilschritt (der Index wäre hier bei 2):

Daten  01000 >> 00100
Index: 01234 >> 01234

Zuletzt wird die Methode neu aufgerufen, mit der selben Sequenz, aber einem veränderten Index (der rutscht zuvor um 1 nach vorn).

Dann muss noch das neue erste Zeichen angehängt werden:

public static void moveRight(char[] sequence, char letterToAdd) {
  moveRight(sequence, sequence.length - 1);
  sequence[0] = letterToAdd;
}

Und ein Test sieht so aus:

char[] letters = "abcdef".toCharArray();
char[] sequence = "00000".toCharArray();

for (char letter : letters) {
  moveRight(sequence, letter);
  System.out.println(sequence);
}

Ideone: https://ideone.com/AxLNTx

Was du eigentlich machen möchtest ist folgendes (muss es rekursiv sein?)

String lCompleteString = "00000"

Lies das Zeichen ein.

String lInputString = Zeichen;

Jetzt nimmst du das was du schon hast, wir nennen es "lCompleteString" das ist also der String, der maximal 5 Zeichen lang sein darf.

lCompleteString = lInputString + lCompleteString;

Jetzt ist das Zeichen davor, könnte natürlich jetzt länger als 5 sein.

Jetzt möchtest du alles wegschmeißen, was über die Länge 5 hinaus geht. Dafür bietet sich substring(AnfangInklusiv, EndeExklusiv) an.

lCompleteString = lCompleteString.substring(0,5); //Versuch nachzuvollziehen, warum da eine 5 und keine 4 hingehört!

Damit hast du jetzt die ersten 5 Zeichen in lComlleteString. Wenn es eine längere Eingabe sein soll, so musst du das nur kurz vor der Ausgabe machen.

Visuell:

"00000"

a+"00000"=a00000

"a00000".substring(0,5) = z.B. a0000 Wenn länge von a = 1

Wobei a ein beliebiger String sein kann.

Wenn du es über ein Array lösen möchtest, nutze ein chararray

String ist ein CharArray

Woher ich das weiß:Studium / Ausbildung – Ich studiere beides.
NatanInfoPhilo  27.11.2018, 13:45

In Code also:

String lCompleteString = "00000"

While(whatsoever) {

String lInputString = getUserInputString();

lCompleteString = lInputString + lCompleteString;

lCompleteString = lCompleteString.substring(0,5);

setOutputString(lCompleteString);

}

0
alexandra1999 
Fragesteller
 27.11.2018, 13:55

Nein, die Eingabe kann so lang sein wie der Benutzer möchte. Es können 5 Werte im Array gespeichert werden, diese sollen bei jeder Eingabe einen weiter rutschen. Wird ein sechster wert eingegeben wird der erste eingegebene wert, der sich inzwischen auf der letzten stelle befindet, verworfen.

Ja es muss rekursiv sein , müssen auch mit unterprogramm arbeiten. Das wäre halt die Rekursion dann.

0
NatanInfoPhilo  27.11.2018, 15:38
@alexandra1999

damit es für eine beliebig lange eingabe funktioniert, musst du den input einmal umdrehen, außer er soll nicht Buchstabe für Buchstabe eingelesen werden. Dann sollte das funktionieren.

Was genau soll rekursiv sein? Das ganze Programm oder nur das Einlesen oder nur das durchgehen und rauswerfen?

Rekursiv bedeutet:

https://de.wikipedia.org/wiki/Rekursion

Du nutzt oben auch keine Rekursion. Bist du sicher, dass Rekursion erwünscht ist?

0