Rekursion über int und array gibt zu wenige Werte zurück

Status
Nicht offen für weitere Antworten.

Jagito

Mitglied
Hi,

um eine Permutation abzubilden, habe ich eine rekursive Methode geschrieben. Diese soll alle möglichen Permutationen aus z.B. drei Zahlen darstellen und zurückgeben.

Java:
  public static int[] schleife (int w, int[]data){
	 if (w>data.length-2){
		 return data;
		 
	 }
	 else{
	  	 if (data[w]!=-1){
	  		 data[w] = data[w]-1;
			 return schleife(w, data);
	  	 }
	  	 else{
	  		 data[w]=urspr_data[w];
	  		 data[w+1]=data[w+1]-1;
	  		 if(data[w+1]==0){
	  			 w=w+1;
	  		return schleife(w, data);
	  		 }
	  		return schleife(w, data);
	  	 }

	 }
  }
Weiter unten in meinem Code rufe ich dann die Methode auf, und möchte mir alle Permutationen ausgeben lassen.

Java:
int[]test = new int[3];
	test=vz.schleife(0, urspr_data);
	for (Integer zahl: test){
		System.out.println(zahl);
	}


Zu den Bezeichnungen: urspr_dataist das ursprüngliche array, das ich mir am Anfang initialisiere durch static int [] urspr_data= {23,17,11};
w ist ein Laufindex, der dafür achten soll, dass die rekursive Methode abbricht.

Meine Idee ist, dass ich mir die Zahlen wie folgt ausgeben lasse:
23 17 11
22 17 11
21 17 11
...
0 17 11
_______
23 16 11
22 16 11
...
0 16 11
_______
...
...
23 0 11
...
0 0 11
_______
23 17 10
22 17 10
usw.

Der Code bildet wahrscheinlich noch nicht alle Zahlenkombinationen ab. Dies kann ich hoffentlich noch im späteren Verlauf ändern.
Mir ist bisher unklar, warum er in der System.out.-Ausgabe lediglich -1 -1 0 schreibt und nicht alle vorhergehenden Werte.

Wo habe ich den Fehler gemacht?
 

Tharsonius

Bekanntes Mitglied
Dass nur eine Zeile ausgegeben wird ist in soweit logisch, da Du nur einen Aufruf der System.out.println hast. Die steht nämlich am Ende, wenn alles durch ist und gibt einmalig das Array aus.

Zur Rekursion selber, soweit ich das sehe übergibst Du immer die selbe Referenz des Arrays. Das heißt Du erstellst keine Kopie, es werden also in der Rekursion die Originaldaten verändert.

Das 1. if im Else Zweig sogt dafür, dass die Rekursion so lange aufgerufen wird, bis der erste Wert bei -1 ist, bis dahin wird data[0] stur decrementiert. Einmal bei -1 angekommen gehts immer in den nächsten else Zweig.
Hier wird zwar jedesmal data[0] auf den Wert im Originalarray gesetzt, dieser ist aber -1, weil eben keine Kopie erstellt wurde. Nun wird data[1] solange dekrementiert, bis dies 0 ist, danach wird w erst auf 1 gesetzt, was durch das erste if im else Zweig ebenfalls zu einem -1 wird. Danach wird data[2] decrementiert, bis es auf 0 ist, w auf 2 gesetzt und der nächste Aufruf beendet dann alles (durch das 1. if)

Ergo wurde in der Rekursion der Inhalt des Array auf -1 -1 0 geändert und dies wird am Ende korrekterweise ausgegeben.


Edit:
Als erstes musst Du die Ausgabe in die rekursion schieben, so dass nach jeder Manipulation ausgegeben wird, bevor der neue Aufruf erfolgt.

Als zweites musst Du vorher eine Echte Kopie der Originaldaten erstellen und diese kannst Du dann in die rekursion geben. Erst dann klappt das mit dem zurücksetzen auf die Originalwerte.
 
Zuletzt bearbeitet:

Jagito

Mitglied
Die Fehler in der Rekursion leuchten mir ein. Danke :)

Wie kann ich dann den Code verändern, so dass auch alle Zwischenschritte bei System.out.println ausgegeben werden?

Ziel von dem ganzen ist eigentlich, dass meine rekursive Methode das array data zurückgibt (mit diesem würde ich noch Berechnungen durchführen, was ich durch das System.out.println erstmal abbilde). Dann soll die rekursive Methode bis zum Abbruchkriterium wiederholt werden und jeweils das neu erstellte data-array zurückgeben.
Anscheinend jedoch gibt die Methode nur das allerletzte array zurück. Wo muss ich da die Änderung machen?
 

Tharsonius

Bekanntes Mitglied
Ganz nebenbei, muss es denn unbedingt eine Rekursion sein?
Einfacher geht das ganze mit 3 for Schleifen. Zumindest so lange es immer 3 Zahlen sind.

Java:
public static void schleife (int w, int[]data)  // void statt int[], da Berechnung in Rekursion erfolgt
{
  if (w > data.length-2)
  {
    return;
  }
  else
  {
    if (data[w]!=-1)
    {
      data[w] = data[w]-1;
    }
    else
    {
      data[w]=urspr_data[w];
      data[w+1]=data[w+1]-1;
      if(data[w+1]==0)
        w=w+1;
    }
    berechne(data);
    return schleife(w, data);
  }
}

Der restliche Code entsprechend:

Java:
int[]test = new int[3];
test[0]=urspr_data[0];
test[1]=urspr_data[1];
test[2]=urspr_data[2];
schleife(0, test);


Und natürlich die Berechnung:
Java:
void berechne(int[] data)
{
  for (Integer zahl: data)
  {
    System.out.println(zahl);
   }
}
 

Jagito

Mitglied
Ja, das ist die Krux an der Sache. Es sind nicht immer drei Zahlen, sondern je nach Einstellung variiert das.
Daher war für mich die Lösung eine rekursive Methode.

Deinen Code habe ich gerade ausprobiert. Danke!

Der Compiler hat mir Fehler angezeigt. Daher habe ich void berechne(int[] data)
auf static void berechne(int[] data) geändert.
Jetzt kommt noch eine Fehlermeldung zu Zeile 21 erste Code-Box:
Void methods cannot return a value

Würde ich stattdessen nur return schreiben, sind in der console wieder nur drei Zahlen zu sehen und nicht mehr.

Habe ich etwas falsch gemacht?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ein Program über Rekursion Hilf mir bitte Java Basics - Anfänger-Themen 2
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
M Variablen Rekursion mit 2 Parameteren Java Basics - Anfänger-Themen 4
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
M Lösungsweg Rekursion Java Basics - Anfänger-Themen 1
C StackOverflow bei Rekursion Java Basics - Anfänger-Themen 7
D Rekursion - Ich raffs nicht Java Basics - Anfänger-Themen 16
N Methoden Rekursion mit Kreisen Java Basics - Anfänger-Themen 7
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
J Rekursion Java Basics - Anfänger-Themen 22
T Rekursion Programmierverständnis Java Basics - Anfänger-Themen 12
K Rekursion: Rechenmauer mit Array erstellen Java Basics - Anfänger-Themen 17
K Rekursion einer Zahlenfolge (Ab- und Aufzählung) Java Basics - Anfänger-Themen 6
Zeppi Rekursion Java Basics - Anfänger-Themen 15
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
L REKURSION Java Basics - Anfänger-Themen 13
Kirby.exe Rekursion Java Basics - Anfänger-Themen 7
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
X Rekursion Java Basics - Anfänger-Themen 3
H Rekursion Java Basics - Anfänger-Themen 2
D Erste Schritte Rekursion Java Basics - Anfänger-Themen 13
M Rekursion Tage Ansteckung gesamte Bevölkerung Java Basics - Anfänger-Themen 15
M Java Rekursion Java Basics - Anfänger-Themen 9
G Java Rekursion Java Basics - Anfänger-Themen 5
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
N Rekursion Java Basics - Anfänger-Themen 18
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
X Rekursion Rätsel Java Basics - Anfänger-Themen 4
N Klassen Rekursion mit Feldern von Objekten Java Basics - Anfänger-Themen 14
W Rekursion Java Basics - Anfänger-Themen 0
D Konsolenausgabe Zahlenfolge Rekursion Java Basics - Anfänger-Themen 3
J Ping Pong Methode mit Rekursion Java Basics - Anfänger-Themen 1
N Rekursion Java Basics - Anfänger-Themen 1
B Rekursion Basic Java Basics - Anfänger-Themen 15
O Rekursion Mergesort Java Basics - Anfänger-Themen 18
G Rekursion Java Basics - Anfänger-Themen 20
M Rekursion Java Basics - Anfänger-Themen 7
F Hilfe bei Rekursion... Java Basics - Anfänger-Themen 4
A Mit Rekursion Zufallszahlen erstellen und größte finden Java Basics - Anfänger-Themen 5
B Rekursion Wurzel Java Basics - Anfänger-Themen 39
O Rekursion ordentlich aufschreiben Java Basics - Anfänger-Themen 2
B Rekursion verstehen Java Basics - Anfänger-Themen 4
O Rekursion Java Basics - Anfänger-Themen 2
E Rekursion verstehen. Java Basics - Anfänger-Themen 4
E Rekursion Kisten befüllen Java Basics - Anfänger-Themen 10
E Rekursion verstehen Java Basics - Anfänger-Themen 2
O Rekursion, String Java Basics - Anfänger-Themen 8
N Invertierte Rekursion??? Java Basics - Anfänger-Themen 5
M Bitte um Hilfe bei Quellcode (Rekursion) Java Basics - Anfänger-Themen 6
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
L Rekursion im Baum Java Basics - Anfänger-Themen 9
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
L Rekursion Baumknoten Java Basics - Anfänger-Themen 8
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
L Rekursion Modulo Java Basics - Anfänger-Themen 7
I Rekursion Java Basics - Anfänger-Themen 11
H Rekursion Java Basics - Anfänger-Themen 7
N Methoden zur Rekursion (catalansche Zahlen) Java Basics - Anfänger-Themen 4
S Frage zu Rekursion... Java Basics - Anfänger-Themen 15
N Java catalansche Zahlen (Rekursion) Java Basics - Anfänger-Themen 5
S Noch eine Frage zur Rekursion... Java Basics - Anfänger-Themen 11
S Frage zu einer Rekursion Java Basics - Anfänger-Themen 15
F Methoden Abbruchbedingung bei Rekursion Java Basics - Anfänger-Themen 2
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Rekursion Java Basics - Anfänger-Themen 5
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
N Rekursion Java Basics - Anfänger-Themen 2
B Rekursion - Übung Java Basics - Anfänger-Themen 2
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
P Rekursion Java Basics - Anfänger-Themen 19
G Rekursion Beispiel Java Basics - Anfänger-Themen 3
M Rekursion schreiben Java Basics - Anfänger-Themen 16
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T Array Rekursion Java Basics - Anfänger-Themen 1
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Rekursion Java Basics - Anfänger-Themen 2
B Rekursion Java Basics - Anfänger-Themen 3
A Rekursion stoppt an der falschen Stelle Java Basics - Anfänger-Themen 4
A Lineare Rekursion Java Basics - Anfänger-Themen 6
P Hilfe zur Rekursion? Java Basics - Anfänger-Themen 2
B Rekursion Schneeflocke - Kurze Frage zur Methode Java Basics - Anfänger-Themen 11
L Rekursion Java Basics - Anfänger-Themen 4
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
E Rekursion Java Basics - Anfänger-Themen 10
G rekursion nicht verstanden Java Basics - Anfänger-Themen 5
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
E Methoden String wird in Rekursion nicht überschrieben Java Basics - Anfänger-Themen 2
T 2fach Rekursion. Java Basics - Anfänger-Themen 4
N Rekursion mit if-Anweisung Java Basics - Anfänger-Themen 10
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
P Methoden Primzahltest mit Rekursion Java Basics - Anfänger-Themen 3
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben