Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array

Blacktycho

Mitglied
Hallo Liebe Community,

wie im Titel beschrieben geht es hierbei nicht um eine genaue Aufgabenstellung, sondern eher um das grundlegende Verständnis.

In einer Hausaufgabe muss ich mit 2-dimensionalen Arrays arbeiten und eine Methode rekursiv aufrufen. Ich habe mich gestern den ganzen Tag mit Arrays und Rekursionen beschäftigt, nur leider kann ich dieses Wissen nicht bei mehrdimensionalen Arrays anwenden. Auch google/Foren Suche brachte mich nicht weiter...

Deshalb habe ich mir heute selbst eine kleine Aufgabe gestellt um Schritt für Schritt die Vorgehensweise von Java nachvollziehen zu können.

Mein kleines Programm soll mir eine 3x3 Matrix auf der Konsole ausgeben. Mit einer verschachtelten for-Schleife klappt das auch, das Ergebnis sieht so aus :
Code:
    public static void main(String[] args) {
       
        String[][] array = new String [3][3];
   
        for(int i = 0 ; i<array.length;++i){

            for (int j = 0; j< array[0].length;++j){
            array[i][j]= " Zeile :" +i+ " Spalte :" +j;   
            }
            System.out.println();
        }
    }
}
Code:
 Zeile :0 Spalte :0 Zeile :0 Spalte :1 Zeile :0 Spalte :2
 Zeile :1 Spalte :0 Zeile :1 Spalte :1 Zeile :1 Spalte :2
 Zeile :2 Spalte :0 Zeile :2 Spalte :1 Zeile :2 Spalte :2

Danach versuche ich das gleiche rekursiv zu lösen mit folgendem Code und Ergebnis :

Code:
public class arraytest {

    static void arrayRekursiv (String [][] a , int indexZeile, int indexSpalte){


    if (indexZeile == a.length || indexSpalte == a[0].length){
        return;
    }
       
        a[indexZeile][indexSpalte] = "Zeile :" +indexZeile+ "Spalte :" +indexSpalte;   
        System.out.print(a[indexZeile][indexSpalte]);
        System.out.println();
       
        arrayRekursiv(a,indexZeile,indexSpalte+1);
       
        arrayRekursiv(a,indexZeile +1 ,indexSpalte);   
}

   

    public static void main(String[] args) {
       
        String[][] array = new String [3][3];


        arrayRekursiv(array,0,0);
    }

Die Ausgabe sieht dann aber komplett anders aus :

Code:
Zeile :0Spalte :0
Zeile :0Spalte :1
Zeile :0Spalte :2
Zeile :1Spalte :2
Zeile :2Spalte :2
Zeile :1Spalte :1
Zeile :1Spalte :2
Zeile :2Spalte :2
Zeile :2Spalte :1
Zeile :2Spalte :2
Zeile :1Spalte :0
Zeile :1Spalte :1
Zeile :1Spalte :2
Zeile :2Spalte :2
Zeile :2Spalte :1
Zeile :2Spalte :2
Zeile :2Spalte :0
Zeile :2Spalte :1
Zeile :2Spalte :2

Ich hoffe es kann mir jemand helfen geben und Ihr entschuldigt, dass ich den Code nicht farblich markiert habe(wusste nicht wie dies funktioniert)


Herzlichen Dank,
Blacktycho
 
Zuersteinmal soltest du dich fragen was arrayRekursiv eigentlich genau machen soll.
Es soll a[indexZeile][indexSpalte] und alle darauf folgenden Elemente ausgeben.
Wenn du das hier schreibst
Java:
arrayRekursiv(a,indexZeile,indexSpalte+1);
arrayRekursiv(a,indexZeile +1 ,indexSpalte);
Und dann bspw. indexZeile = 1 und indexSpalte = 2 ist, dann heisst das praktisch:
"gib a[1][3] und alle darauf folgenden Elemente aus und hinterher gib a[2][2] und alle folgenden Elemente aus".
Am einfachsten wäre es du machst zwei rekursive Methoden. Eine gibt alle Elemente bis zum Ende der aktuellen Zeile aus. Die andere gibt alle Zeilen aus. Oder aber du änderst die if Bedingung ab. Wenn indexZeile == a.length machst du am Anfang der nächsten Zeile weiter.
 
Zuletzt bearbeitet:
Habe es nun danke Zoidbergs Tipp geschafft. Die Ausgabe auf der Konsole ist exakt die gleiche wie bei der iterativen Variante. Die Methode auf zwei Methoden aufzuteilen war leider keine Option, da dies ja eine Übung zum Verständnis der Hausaufgabe sein sollte und wir dort nur eine Methode verwenden dürfen.

Finde es allerdings verwirrend, dass ich nochmals eine if-Anweisung IN eine andere if-Anweisung bauen musste. Gibt es da noch eine schönere Lösung, oder muss man es so machen, weil es sich um ein 2-dimensionales Array handelt ?

Auch finde ich es unschön in der else if-Anweisung für indexSpalte einfach Null schreiben zu müssen, gibt es hier die Möglichkeit sich die Null aus dem Aufruf der Main-Methode zu holen ?

Code:
public class arraytest {

    static void arrayRekursiv (String [][] a , int indexZeile, int indexSpalte){

    if ( indexZeile < a.length)    {
     
        if (indexSpalte < a[0].length){
            a[indexZeile][indexSpalte] = " Zeile :" +indexZeile+ " Spalte :" +indexSpalte;
            System.out.print(a[indexZeile][indexSpalte]);
            arrayRekursiv(a,indexZeile,indexSpalte+1);
        }else if (indexSpalte == a[0].length){
            System.out.println();
            arrayRekursiv(a,indexZeile+1,0);
        }
     
    }else{
        return;
    }
}

 

    public static void main(String[] args) {
     
        String[][] array = new String [3][3];
     
        arrayRekursiv(array,0,0);

    }
}
 
Zuletzt bearbeitet:
Du könntest auch schreiben
Java:
if(indexZeile >= a.length)  {
  return;
} else if(indexSpalte < a[0].length) {
  ...
} else {
   ...
}
Dann hast du keine verschachtelten if Anweisungen. Und indexSpalte auf Null zu setzen ist absolut korrekt. Es sei denn du willst nur einen Teil des Arrays ausgeben, dann müsstest du den Index der ersten Spalte als Argument an deine Methode übergeben.
 
Danke deiner Hilfe habe ich nun das Grundprinzip verstanden und konnte meine Hausaufgabe weitermachen. Erstmal ein dickes Dankeschön dafür!

Natürlich kommt gleich nach dem Erfolgserlebnis eine schier unlösbare Aufgabe :

In meiner rekursiven Methode soll ich EXAKT einmal eine vorgegeben Hilfsmethode als erste Anweisung aufrufen(es wird nicht erklärt was diese macht....) Nun dachte ich aber, das immer alle Anweisungen die in der Methode VOR dem rekursiven Aufruf stehen immer wieder ausgeführt werden, bis eben meine Abbruchbedingung erreicht wird.

In der Aufgabe wird aber explizit darauf hingewiesen, dass die Hilfsmethode exakt nur einmal aufgerufen werden soll.

Bin gerade echt am verzweifeln, sofort wird mir alles zunichte gemacht, was ich bis jetzt über Rekursion gelernt habe....
 
Wahrscheinlich ist damit einfach nur so was gemeint:
Java:
static void _arrayRekursiv(String [][] a , int indexZeile, int indexSpalte){
  ...
}

static void arrayRekursiv(String [][] a){
  _arrayRekursiv(a, 0, 0);
}
 

Zurück
Oben