Zweidimensionale Array...

Mole23

Aktives Mitglied
Moin zusammen, ich habe hier mal ein kleines Problem. Es handelt sich zwar nicht um Hausaufgaben, da ich mich lediglich auf meinen Studiengang im April etwas vorbereite, aber ich bin hier bei sonem Übungsbeispiel auf folgendes Problem gestoßen:

Ich möchte gerne das sich meine Array wie folg fortsetzt:

1 2 3 4
2 4 7 11
3 7 14 25
4 11 25 50

Denke das Prinzip ist ersichtlich. Mein Lösungsansatz sieht wie folgt aus:

Java:
public class Matrix {


	public static void main(String[] args) {
		
		int[][] x = new int[9][10];
		
		for (int i=0;i<x.length;i++) {
            for (int j=0;j<x[i].length;j++) {
				
            	
            	
            	x[i][j] = ((i+1)+j);  // Denke hier liegt der Fehler

 
				
            	System.out.print(x[i][j] + "  ");


			}
            System.out.println();

		}
	}
}

Für Lösungsideen bin ich dankbar!
 

Marco13

Top Contributor
Es ist auch "ersichtlich", dass die Goldbach'sche Vermutung stimmt. Das bringt einem aber nichts.

Wenn du die Regel beschreiben würdest, die die Elemente gebildet werden, wäre die Aufgabe gelöst.

Ich könnte mir vorstellen, dass das rekursiv am einfachsten wäre, aber ist nur ein Tipp.
 

Marco13

Top Contributor
Jo, rekursiv ist's einfach :D
Code:
    private static int compute(int x, int y)
    {
        if (x==0 && y==0) return 1;
        if (x==0) return 1+y;
        if (y==0) return 1+x;
        return compute(x-1,y)+compute(x,y-1);
    }
 

Marco13

Top Contributor
Rekursiv heißt, dass eine Funktion sich selbst aufruft. Ist zwar (in diesem Fall) ziemlich ineffizient, und das mit dynamischer Programmierung zu lösen drängt sich natürlich auf, aber ... hey, du wolltest ja nur "irgendeine" Lösung ;)
 
S

SlaterB

Gast
> x[j] = ((i+1)+j);
jedes Feld ist anscheinend die Summe zweier anderer schon befüllter Felder, deren Position sich einfach errechnen läßt,
da muss nur der richtige Befehl stehen:

x[j] = feld .. + feld .. ;

Spezialfall: Rand, mit if/ else abfangen
 

Mole23

Aktives Mitglied
Ich glaube ich habe die Lösung gefunden, allerdings endet jetzt meine Gleichung am Anfang immer auf -1 und ich bekomme einen Error... Kann man das irgendwie umgehen? Sieht jetzt wie folgt aus:

Java:
public class MatrixSnd {


	public static void main(String[] args) {
		
		int[][] x = new int[9][10];
		
		for (int i=0;i<x.length;i++) {
            for (int j=0;j<x[i].length;j++) {
				
            	

            	x[i][j] = (x[i-1][j])+(x[i][j-1]); 

 
				
            	System.out.print(x[i][j] + "  ");


			}
            System.out.println();

		}
	}
}
 

Marco13

Top Contributor
EDIT: Das war vor deinem letzten Beitrag geschrieben:

Ja, aber nochmal: Das [EDIT: rekursive] ist ziemlich ineffizient. Eigentlich sollte man
- Die erste Zeile und Spalte füllen (einfach 1 bis n durchnummerieren)
- Dann die übrigen Felder (x,y) füllen - darin steht jeweils die Summe der Felder (x-1,y) und (x,y-1)


EDIT2: ... aber es könnte trotzdem auch für deinen Letzten Beitrag hilfreich sein ;)
 

Mole23

Aktives Mitglied
Ok, ich bin doch etwas weiter gekommen... Die Rechnung scheint zu stimmen!

Allerdings fängt meine Rechnung aus irgend einem Grund mit 4 an... Kann jemand das Problem ersehen?

Code:
Java:
public class Matrix {

	
	public static void main(String[] args) {
		
		int[][] x = new int[10][10];
		
		for (int i=0; i<x.length; i++){
			x[0][i] = i+1;
		}
		for (int j=0; j<x.length; j++){
			x[j][0] = j+1;
		}
		
		
		for (int i=1;i<x.length;i++) {
            for (int j=1;j<x[i].length;j++) {
				
            	
            	
            	x[i][j] = (x[i-1][j])+(x[i][j-1]); 

            	
				
            	System.out.print(x[i][j] + "  ");


			}
            System.out.println();
     
		}
	}
}


Ergebnis:

4 7 11 16 22 29 37 46 56
7 14 25 41 63 92 129 175 231
11 25 50 91 154 246 375 550 781
16 41 91 182 336 582 957 1507 2288
22 63 154 336 672 1254 2211 3718 6006
29 92 246 582 1254 2508 4719 8437 14443
37 129 375 957 2211 4719 9438 17875 32318
46 175 550 1507 3718 8437 17875 35750 68068
56 231 781 2288 6006 14443 32318 68068 136136
 
S

SlaterB

Gast
du hast die Doppelschleife Zeile 16 + 17 so verändert, dass sie nur noch die inneren Felder abläuft,
gar nicht schlecht

allerdings hast du nun auch die Ausgabe nur auf die inneren Felder, die Ränder läßt du weg..

baue für die Ausgabem am Ende noch eine zweite Doppelschleife, die bei 0 beginnt
 

Mole23

Aktives Mitglied
Juhu! Es klappt! Bevor ich hier abschließend den final richtigen Code poste, möchte ich mich noch einmal für die wirklich raschen und hilfreichen Antworten bedanken:

Vielen Dank und macht weiter so! :toll:



Hier mein Ergebnis:

Java:
public class Matrix {

	
	public static void main(String[] args) {
		
		
		
		int[][] x = new int[10][10];
		
		for (int i=0; i<x.length; i++){
			x[0][i] = i+1;
		}
		for (int j=0; j<x.length; j++){
			x[j][0] = j+1;
		}
		
		
		for (int i=1;i<x.length;i++) {
            for (int j=1;j<x[i].length;j++) {
				       	
            	x[i][j] = (x[i-1][j])+(x[i][j-1]); 
            	
            	
            	System.out.print(x[i-1][j-1] + "  ");

			}
            
            System.out.println();
		}
	
	
	
	}
}
 

Mole23

Aktives Mitglied
So nun ist alles schön! Noch einmal THX an alle!

Java:
public class Matrix {

	
	public static void main(String[] args) {
		
		
		
		int[][] x = new int[10][90];
		
		for (int i=0; i<x[0].length; i++){
			x[0][i] = i+1;
		}
		
		for (int j=0; j<x.length; j++){
			x[j][0] = j+1;
		}
		
		for (int i=1;i<x.length;i++) {
            for (int j=1;j<x[i].length;j++) {
				       	
            	x[i][j] = (x[i-1][j])+(x[i][j-1]); 
            	

			} 
		}
		
		print(x);
	}

	private static void print(int[][] x) {
		
		for (int i=0;i<x.length;i++) {
            for (int j=0;j<x[i].length;j++) {
	
		System.out.print(x[i][j] + "\t");
            }
        System.out.println();
		}
	}
}
 

Oben