# Pascalsches Dreieck ohne array und rekursion



## t_daniel (10. Okt 2011)

Hallo, 

also ich habe folgende Frage oder auch Problem. Ich möchte das Pascalsche Dreieck ausgeben. Möchte aber dazu kein arrays und rekursionen verwenden. Aber irgendwie komme ich bis dato auf keinen grünen Zweig mit der Berechnung. Ich hoffe mir kann da jemand weiterhelfen. Hier mal mein Programm bis jetzt.


```
public static int pascalsches(int zeile, int spalte) {
		if (spalte==0 || spalte==zeile)								
			return 3;										
			return pascalsches(zeile-1,spalte) + pascalsches(zeile-1,spalte-1);
	}
public static void main(String[] args) {
String leerzeile="";
char l= ' ';
int i=50;
			
	for (int zeile=0; zeile<10; zeile++) {
		leerzeile="";
		i-=2;
	for (int a=i; a>=0;a--) {
		leerzeile+=""+l;
	}
	System.out.printf(leerzeile);
	for (int spalte=0;spalte<=zeile;spalte++){
		System.out.printf("%4d", pascalsches(zeile,spalte));
	}
System.out.println();
}
int wert = pascalsches(2, 1); //spätere Zeile die angezeigt wird
if (wert==0)
	System.out.println("Eingabe ist fehlerhaft");
else {
System.out.println("________________________" );
System.out.println("Zahl ist " + wert);
}
}
}
```

Also das ist mein Code soweit. Ich hoffe ihr könnt mir weiterhelfen.

Liebe grüße


----------



## Gast2 (10. Okt 2011)

Du kannst jede Zahl innerhalb des pascalschen Dreiecks anhand der Zeile i und Spalte j berechnen. Die zahl die du suchst ist dann einfach "i über j". Du musst dir also nicht die vorherigen Zahlen in nem array merken.
Alles was du brauchst wäre so ne Methode wie:

```
printZeile(int zeile)
```


----------



## modolo (17. Okt 2011)

@EikeB:

Habe das gleiche Problem und muss leider gestehen, dass ich deinen Beitrag nicht sooo ganz verstehe.
Das mit dem Binomialkoeffizient scheint soweit kein Thema zu sein.
Nun stehe ich ein wenig auf dem Schlauch wie ich beides verbinden soll.
Wie schaffe ich es ohne Array dem Programm zu sagen:
Rechne den Bino aus und gebe für 6 Zeilen das Dreieck aus!
Sprich, dass es eben wie folgt aussieht

1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5  10 10   5   1

Schonmal Danke im Voraus


----------



## Gast2 (17. Okt 2011)

Jede Zahl in dem Dreieck lässt sich ja als Binomialkoeffizient darstellen. die Zahl in Zeile n und Spalte k entspricht "n über k", n und k beginnen jeweils bei 0.

Mit dem Wissen lassen sich relativ einfach die nötigen Methoden schreiben. Die erste wäre z.b. printRow(int row) die uns eine beliebige Zeile des Pascalschen Dreicks ausspuckt:

```
private void printRow(final int row) {
		for (int i = 0; i <= row; i++) {
			int binCoeff = binomialCoefficient(row, i);

			System.out.print(binCoeff + " ");
		}
	}
```
Nun brauchen wir nur noch eine Methode die uns alle Zeilen ausgibt, die könnte z.b. so aussehen:

```
public void printPascalTriangle(final int rows) {
		for (int i = 0; i < rows; i++) {
			printRow(i);
			System.out.println();
		}
	}
```
Rufen wir diese Methode nun auf, wird das komplette Pascalsche Dreieck mit den Zeilen 0 bis rows-1 auf der Konsole ausgegeben. Die Methode 
	
	
	
	





```
binomialCoefficient
```
 muss dann natürlich auch noch entsprechend implementiert werden, da gibts ja mehrere Ansätze.


----------



## modolo (17. Okt 2011)

Das wäre ja dann die main class
public static void main (String[] args)

anschließend die Binoclass mit n und k
public static void long binomialkoeffizient (long n, long k)

und dann die Klassen die du netterweise für mich vorbereitet hast. Dafür auch schon mal Danke .

right? Oder lieg ich da falsch?


----------



## SlaterB (17. Okt 2011)

> public static void main (String[] args)
kommt in quasi jeden Programm vor

> public static void long binomialkoeffizient (long n, long k)
ergibt sich aus dem geposteten Code, richtig, nicht notwendigerweise statisch, aber durchaus denkbar

insofern: right, ja, viel zu bestätigen gab es da aber nicht


----------



## modolo (17. Okt 2011)

Oh man, mir hängt das scheinbar höher als gedacht :-(

Mit folgendem Quellcode hätte man ohne Arrays geschafft.


```
package mypack;

public class pascal {

			public static int function_pascal(int zeile, int spalte) {
			if (spalte==0 || spalte==zeile)
			return 1;
			return function_pascal(zeile-1,spalte) + function_pascal(zeile-1,spalte-1);
			}

			public static void main(String[] args) {
			for (int zeile=0; zeile<7; zeile++) {
			for (int spalte=0; spalte<=zeile; spalte++) {
			System.out.print(function_pascal(zeile, spalte) + " ");
			}
			System.out.println();
			}
			}
	}
```
Ist zwar nicht umbedingt sooo schön formatiert von der Ausgabe her, aber das wäre ja schon der ganz Spass. Wäre da nicht noch die Anforderung das man mit diesem verdammten Binomialkoeffizienten schaffen soll.
Und da ist genau mein Problem. Wie schreibe ich das Programm jetzt so um, dass ich den Bino noch mit rein nehme das ganze dann ohne Arrays arbeitet und ach so, ja rekursiv darf es ja auch nicht sein ...
Verdammte Axt, ich verzweifel hier echt noch...
???:L


----------



## SlaterB (17. Okt 2011)

Binomialkoeffizient kann man doch berechnen, lustig Zahlen multiplizieren
Binomialkoeffizient ? Wikipedia

denke dabei unbedingt an optimiere Varianten, sonst sehr schnell Überlauf des Zahlenbereichs,
bei (10 über 9) nicht 10! und 9! ausrechnen und teilen sondern kürzen

Rekursion brauchst du in diesem Fall ansonsten auch gar nicht, insofern keine Sorgen, Schleife über Schleife und Werte korrekt normal berechnen


----------



## modolo (17. Okt 2011)

Sag SlaterB... Sorry, bin noch absoluter Neuling...
Habe jetzt für den Bino folgenden Code.
Und bin jetzt am überlegen wie ich die zwei zusammenschraube. Ist dies möglich oder sagst du, dass ich das wieder verwerfen soll und die sache anders betrachten muss

package mypack;

public class PascalschesDreieck {

    public static void main(int zeile, int spalte){
    	int n = 4;
    	int k = 3;
    	int x = n-k;
    	int test = 5;
    	int nfakultaet = 1;
    	int kfakultaet = 1;
    	int nkfakultaet = 1;

    for (int i= 1; i<= n; i++)
    	nfakultaet=nfakultaet*i;
    System.out.println("Die Fakultaet von " +n +" ist " +nfakultaet);

    for (int i= 1; i<= k; i++)
    	kfakultaet=kfakultaet*i;
    System.out.println("Die Fakultaet von " +k +" ist " +kfakultaet);

    for (int i= 1; i<= x; i++)
    	nkfakultaet=nkfakultaet*i;
    System.out.println("Die Fakultaet von " +x +" ist " +nkfakultaet);

    test= nfakultaet/(kfakultaet*nkfakultaet);
    System.out.println(test);

    if (n<0 || k<0 || n<k)
    {System.out.println("Ausgabe nicht moeglich");
    }
    else
    	System.out.println();

    }
}

Schon mal Danke für die bisherige Hilfe... Gibt mir wenigstens nen kleinen Lichtblick


----------



## SlaterB (17. Okt 2011)

ohne Listen/ Arrays wird die Optimierung vielleicht hässlich, falls es bisher schon klappt, soll es mir recht sein, 
6! ist das höchste?

denke daran [ JAVA ]-Tags zu verwenden, steht doch überall in roter Schrift..


----------

