# Zweidimensionale Array...



## Mole23 (18. Jan 2010)

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:


```
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 (18. Jan 2010)

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.


----------



## Mole23 (18. Jan 2010)

Was heißt rekursiv? Habe leide nicht viel Plan, da ich noch nie eine Schulung oder der gleichen besucht habe... Sorry!


----------



## Marco13 (18. Jan 2010)

Jo, rekursiv ist's einfach 

```
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 (18. Jan 2010)

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


----------



## SlaterB (18. Jan 2010)

> 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 (18. Jan 2010)

Ah ich glaube zu verstehen


----------



## Mole23 (18. Jan 2010)

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:


```
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 (18. Jan 2010)

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


----------



## SlaterB (18. Jan 2010)

@Mole:

ich schreibe


SlaterB hat gesagt.:


> x_[j] = feld .. + feld .. ;
> 
> Spezialfall: Rand, mit if/ else abfangen_


_

du tippst nur
> x[j] = feld .. + feld .. ;
ein und wunderst dich nun über Fehler? das ist ja recht langsam gedacht.._


----------



## Mole23 (18. Jan 2010)

...


----------



## Mole23 (18. Jan 2010)

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:

```
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


----------



## SlaterB (18. Jan 2010)

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 (18. Jan 2010)

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:


```
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();
		}
	
	
	
	}
}
```


----------



## SlaterB (18. Jan 2010)

damit gibst du die 10. Zeile + Spalte nicht aus, das weißt du schon?


----------



## Mole23 (18. Jan 2010)

Mir ist eh gerade aufgefallen, dass wenn die Spalte < Zeile ist, es noch n Error gibt... Bin aber dran...


----------



## Mole23 (18. Jan 2010)

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


```
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();
		}
	}
}
```


----------

