Binominal Koeffizienten programieren

Murmeltier1985

Aktives Mitglied
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.
 
Zuletzt bearbeitet:

eRaaaa

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

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: ):
Java:
    if (n < 0 || n < k) {
        JOptionPane.showMessageDialog(null,
            "Die Eingabe erfüllt nicht die Parameter");
    } else {
        // hier dann die Methode aufrufen
    }
 

Murmeltier1985

Aktives Mitglied
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...
 

eRaaaa

Top Contributor
Nunja, fang doch erstmal klein an, indme du erstmal die Methode richtig deklarierst:
Java:
 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):
Java:
 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

Aktives Mitglied
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

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

Und der Pfeil ist eine Zuweisung!
Java:
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

Aktives Mitglied
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

Top Contributor
Ja Zeile 3 ist der rekursive Aufruf:
Code:
3      dann führe aus ergebnis  <---- binomialkoeffizient(n, n-k)
 

eRaaaa

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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:
Java:
 public static int calculateBinomialCoefficient(int n, int k) {

Wo ist dort denn jetzt ein Unterschied? :autsch:
 

Murmeltier1985

Aktives Mitglied
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

Aktives Mitglied
okay, soweit bin ich :

Java:
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?
 

Murmeltier1985

Aktives Mitglied
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

Top Contributor
Mhm, okay vllt habe ich dich jetzt ein wenig verwirrt mit meiner Klammer :D

Ich meinte oben in der Datei

Code:
private static int aufrufe;

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

Code:
aufrufe++;

Dann änderst du noch die Nachricht im MessageDialog ab:

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

und alles wird gut :toll:
 

Oben