# Binominal Koeffizienten programieren



## Murmeltier1985 (13. Jan 2010)

Einen schönen guten Abend,

nachdem ich folgende Aufgabe 2 Wochen vor mir her geschoben habe, muss ich langsam wieder auf Fehlersuche gehen. Vielleicht kann mir wer helfen?

Aufgabenstellung:

Schreiben Sie ein Programm BinomialCoefficient, das für ein übergebenes n und k
rekursiv das (n über k) berechnet. Bedenken Sie, dass n und k Elemente der natürlichen Zahlen seien müssen.
Der Methodenkopf für die Rekursion soll folgendermaßen aussehen: public static
int calculateBinomialCoefficient(int n, int k)

Testen Sie die Eingabe und bei falschen Eingaben geben Sie \Fehler: Die Eingabe erfüllt
nicht die Parameter" aus. Bei gültiger Eingabe soll das Ergebnis und die Anzahl der
rekursiven Aufrufe ausgegeben werden.
Für alle Eingaben soll JOptionPane.showInputDialog() genutzt werden, für die
Ausgaben JOptionPane.showMessageDialog(null, AUSGABESTRING)

So weit bin ich nun:

[JAVA=42]package grundlagenuebungen;

import javax.swing.JOptionPane;

class BinomialCoefficient {


	public static int calculateBinomialCoefficient(int n, int k) // durch int nur ganze Zahlen
	{ 

		do {  
				n = Integer.parseInt (JOptionPane.showInputDialog("Bitte n eingeben"));
				k = Integer.parseInt (JOptionPane.showInputDialog("Bitte k eingeben"));


				if (n>k) //Bedingung n kleiner als k
				if (n<0) //Nichtnegativitätsbedingung 
				if (k<0) //Nichtnegativitätsbedingung

			JOptionPane.showInputDialog ("Fehler: Die Eingabe erfüllt nicht die Parameter");

	}

	public static long fac(int n) {
		if(n==0 || n==1){return 1;} 
		return n * fac(n-1); //Methode ruft sich selbst wieder auf --wg. Rekursiv
				    } 

	    }




[/code]

Nur leider sind das bis jetzt nur Ideen und ich weiß nicht, wie ich das zum laufen bringen soll. Kann mir vielleicht wer nen Tipp geben?

Vielen Dank, Sarah B.


----------



## eRaaaa (13. Jan 2010)

Was ist jetzt deine genaue Frage oder willst du dass wir dir wieder deinen Code schreiben? 
Die Methode fac die du offensichtlich aus deiner letzten Fakultätsberechnung kopiert hast, nunja, scheint ja nicht ganz zu stimmen 

Hier gibts sogar schon einen fertigen Algo:
Binomialkoeffizient ? Wikipedia
Lässt sich sehr leicht fast 1zu1 in Java implementieren.


Wegen der Eingabe am Anfang (irgendwie so: ):

```
if (n < 0 || n < k) {
        JOptionPane.showMessageDialog(null,
            "Die Eingabe erfüllt nicht die Parameter");
    } else {
        // hier dann die Methode aufrufen
    }
```


----------



## Murmeltier1985 (13. Jan 2010)

Ja, ja, bin halt ne Frau und tu mich damit schwer. hab das jetzt 2 wochen liegen gelassen, muss es aber am samstag abgeben. Hatte gedacht, dass es so schon laufen sollte.... naja, falsches Halbwissen... also geh bitte nicht zu hart mit mir ins Gericht  und fertige Codes möchte ich eh nicht...


----------



## Murmeltier1985 (13. Jan 2010)

Die seite aus wiki hab ich schon durchgelsen, kann mit dem pseudocode aber nicht viel anfangen


----------



## eRaaaa (13. Jan 2010)

Nunja, fang doch erstmal klein an, indme du erstmal die Methode richtig deklarierst:

```
public static int calculateBinomialCoefficient(int n, int k) {
    
    //return ergebnis;
    }
```

So nun steht im Pseudocode wenn k= 0 gebe 1 zurück. Was könnte "wenn..."dann in Java sein? Richtig, if (und evtl. else):

```
public static int calculateBinomialCoefficient(int n, int k) {
    if (k == 0){
        return 1;
     }
    //return ergebnis;
    }
```

usw. ...
Natürlich könnten wir die jetzt den Code hier niederschreiben, aber du sagtest ja selber dass du das nicht möchtest, daher müsstest du schon konkret sagen was du nicht verstehst, bzw wo du nicht weiter kommst?!


----------



## Murmeltier1985 (13. Jan 2010)

okay, das hab ich jetzt

[JAVA=42]public static int calculateBinomialCoefficient(int n, int k) // durch int nur ganze Zahlen

	{ 

		do {  
				n = Integer.parseInt (JOptionPane.showInputDialog("Bitte n eingeben"));
				k = Integer.parseInt (JOptionPane.showInputDialog("Bitte k eingeben"));


				if (n < 0 || k < 0 || n < k)
				{
					JOptionPane.showInputDialog("Fehler: Die Eingabe erfüllt nicht die Parameter");
				} 

				if (k == 0)
				{
			    return 1;
				}

				if  ((2*k) >= n);
				{
				  ///???
				}
						[/code]

Jetzt versteh ich aber vom pseudo code her nicht, was ich returnen soll. Was bedeuten denn die pfeile?


----------



## eRaaaa (13. Jan 2010)

?? Der erste Teil kommt doch nicht in die Methode...das steht doch wohl eher in der main...!

Und der Pfeil ist eine Zuweisung! 

```
public class BinomialCoefficient{
 
    public static void main(String... args) {
    int n = Integer.parseInt(JOptionPane
        .showInputDialog("Geben Sie eine ganzzahlige Zahl für n ein"));
    int k = Integer.parseInt(JOptionPane
        .showInputDialog("Geben Sie eine ganzzahlige Zahl für k ein"));
    if (n < 0 || n < k) {
        JOptionPane.showMessageDialog(null,
            "Die Eingabe erfüllt nicht die Parameter");
    } else {
        JOptionPane.showMessageDialog(null, "Der Binomialkoeffizient ist "
            + calculateBinomialCoefficient(n, k));
    }
 
    }
 
    public static int calculateBinomialCoefficient(int n, int k) {
    int ergebnis = 0;
    if (k == 0)
        return 1;
    if (2 * k > n) {
        ergebnis = //rekursiver Aufruf
    } else {
        //hier das sonst ...
        }
    }
    return ergebnis;
    }
}
```

So nun hast du eine Basis auf der du aufbauen könntest. _(+ Da fehlt dann natürlich noch das Zählen der rekursiven Aufrufe, aber da würd eich mich am Schluß drum kümmern ;D)_


----------



## Murmeltier1985 (13. Jan 2010)

Ist denn der pseudo code von wiki auch die rekursive darstellung? Unser prof meinte wir sollten da dringend drauf achten. Deshalb dachte ich ja, dass es mit 

[JAVA=42]public static long fac(int n) {
		if(n==0 || n==1){return 1;} 
		return n * fac(n-1); //Methode ruft sich selbst wieder auf --wg. Rekursiv
				    } [/code]

funktioniert


----------



## eRaaaa (13. Jan 2010)

Ja Zeile 3 ist der rekursive Aufruf:

```
3      dann führe aus ergebnis  <---- binomialkoeffizient(n, n-k)
```


----------



## Murmeltier1985 (13. Jan 2010)

Was bedeutet denn bei j.option.pane die "null"? Ich kenn das nur ohne. Macht die irgendwas?


----------



## eRaaaa (13. Jan 2010)

Nein. Kümmere dich lieber um die Methode 
(showMessageDialog erwartet halt mind. 2 Parameter, nicht so wie showInputDialog. Der erste (der, der null ist sagt folgendes : parentComponent determines the Frame in which the dialog is displayed; if null, or if the parentComponent has no Frame, a default Frame is used) 
Spielt hier aber absolut keine Rolle. Eig. habt ihr ja auch gar keine GUI.


----------



## Murmeltier1985 (13. Jan 2010)

Wow, sieht schon super aus. Danke. 

Ich hab aber noch das problem mit dem Methodenkopf, der ist ja vorgegeben. 

Dachte es so:

[JAVA=42]package grundlagenuebungen;

import javax.swing.JOptionPane;

class BinomialCoefficient {


	public static int calculateBinomialCoefficient(int n, int k) {	// durch int nur ganze Zahlen

	JOptionPane.showInputDialog("Geben Sie eine ganzzahlige Zahl für n ein");
	JOptionPane.showInputDialog("Geben Sie eine ganzzahlige Zahl für k ein");

	if (n < 0 || n < k)
		{
	        JOptionPane.showMessageDialog(null,"Die Eingabe erfüllt nicht die Parameter");
	    } 

	else
		{
	        JOptionPane.showMessageDialog(null,"Der Binomialkoeffizient ist "+ calculateBinomialCoefficient(n, k));
	    }

	 private static String calculateBinomialCoefficient(int n, int k) 
	 	{
		 	return null;
	 	}


	 public static int calculateBinomialCoefficient(int n, int k) 
	 	{
	    int ergebnis = 0;
	    	if (k == 0)
	    		return 1;
	    	if (2 * k > n)
	    		{
	    		ergebnis = 			//rekursiver Aufruf
	    		} 
	      	else
	      		{
	      		//hier das sonst ...
	      		}

	    return ergebnis;

	 	}
	 [/code]

da bekomme ich aber fehlermeldungen :-(


----------



## eRaaaa (13. Jan 2010)

Also sorry, jetzt weiß ich echt nicht mehr was ich schreiben soll.?! Du machst mich fertig ;(

Ich hab dir doch schon ein "Template" vorgelegt ?!


----------



## Murmeltier1985 (13. Jan 2010)

Ganz großes sorry..... aber ich stell mich auch nicht dumm.... liegt an der materie. So wie du es gemacht hast, hatte es doch einen anderen methodenkopf. Das darf ich, so hab ich es zumindest verstanden, nicht machen... an der methode arbeite ich gerade... das sollte ich hinbekommen.... hoffentlich :-(


----------



## eRaaaa (13. Jan 2010)

Ich zitiere mal:



> Der Methodenkopf für die Rekursion soll folgendermaßen aussehen:
> *public static  int calculateBinomialCoefficient(int n, int k)*




Und so siehts bei mir/dir aus:

```
public static int calculateBinomialCoefficient(int n, int k) {
```

Wo ist dort denn jetzt ein Unterschied? :autsch:


----------



## Murmeltier1985 (13. Jan 2010)

och neeeee, ja hast recht. War zu blöd das richtig zu lesen. Ich schiebs mal auf die Uhrzeit  
Sorry.... find es aber super lieb, dass du mir um diese zeit noch hilfst... gib nicht auf (ich tus auch nicht ;-)

Achso, hab für die anderen Aufgaben immer volle Punktzahlen bekommen. Also werd ich den Kurs wohl mit ner 2 bestehen


----------



## Murmeltier1985 (13. Jan 2010)

okay, soweit bin ich :


```
public static int calculateBinomialCoefficient(int n, int k)
	    {
	    	int ergebnis = 0;
	    	
	    	if (k == 0)
	        return 1;
	    
	    	if (2 * k > n)
	    	{
	    		ergebnis = calculateBinomialCoefficient(n, n-k);   //rekursiver Aufruf
	    	}
	    	
	    	else
	    	{
	    		ergebnis = n;//  hier das sonst ...
	        }
	    }
	    return ergebnis;
	    }
```

was meint der pseudocode von i = 2 bis k?


----------



## eRaaaa (13. Jan 2010)

Na siehste! Sieht doch schon ganz gut aus.



> was meint der pseudocode von i = 2 bis k?


Eine Schleife:

```
for (int i = 2; i <= k; i++) {
		ergebnis *= (n + 1 - i);
		ergebnis /= i;
	    }
```


----------



## Murmeltier1985 (13. Jan 2010)

läuft.... und nun noch die rekursiven aufrufe, geht das über nen counter?


----------



## eRaaaa (13. Jan 2010)

Si Senorita.

vllt als Klassenvariable ? (static int ...)


----------



## Murmeltier1985 (14. Jan 2010)

HAb jetzt gegoogelt, aber nicht wirklich was gefunden. Ich muss dem counter ja sagen wo er anfangen und enden soll und was er zählt.  static int counter { start = ????? 
                                        finish = ????? }
Syso.....


----------



## eRaaaa (14. Jan 2010)

Mhm, okay vllt habe ich dich jetzt ein wenig verwirrt mit meiner Klammer 

Ich meinte oben in der Datei 


```
private static int aufrufe;
```

und dann halt vor deinem rekursiven Aufruf zählst du diese hoch: 


```
aufrufe++;
```

Dann änderst du noch die Nachricht im MessageDialog ab:

"Der Binomialkoeffizient ist "+ calculateBinomialCoefficient(n, k) +" - Aufrufe: "+aufrufe;

und alles wird gut :toll:


----------



## Murmeltier1985 (14. Jan 2010)

...


----------



## Landei (14. Jan 2010)

-- gelöscht, falscher Thread ---


----------

