binomischer Lehrsatz

LeonInfo19

Bekanntes Mitglied
Hallo,
ich möchte eine Methode programmieren, die (a+b)^n nach dem binomischen Lehrsatz berechnet. Z.b für n=2 soll ausgeben werden: a^2 + 2 ab +b^2.
Meine erste Idee:
Java:
    public static void binomLehr(int n) {
        int speicher=n;
        double ergebnis=1.0;
        String summe="";
       
       
        for(int k=0; k<=n; k++) {
           
            if(k==0) ergebnis=1;
            else {
            while(k!=0) {
               
                ergebnis=ergebnis*((double)n/k);   //Binomialkoeffizient
                k--;
                n--;
           
            }
        n=speicher;
            }
        summe=summe +ergebnis + "a" + "^" + (n-k)+ " + " + ergebnis + "b" + "^" + k;   
       
        }
       
        System.out.println(summe);
       
       
       
    }
}

Es fehltnoch, dass a^0 = b^0 =1 und a^1=a bzw. b^1=b, aber das Programm liefert keine Ausgabe. Wo liegt denn der Fehler?
 

Meniskusschaden

Top Contributor
Das ist eine Endlosschleife. Wenn k in der äußeren Schleife auf 1 gesetzt wird, wird die innere Schleife aktiv und setzt k wieder auf 0. Das wiederholt sich dann unendlich.
 

LeonInfo19

Bekanntes Mitglied
Ich weis nicht was du meinst "wie bei Wolfram Alpha". Es gilt doch n über k = n/k (n-1 über k-1).
Wie rette ich dann meine Scheife. Soll ich eine Hilfsvariable einführen, damit das k "erhalten" bleibt?
 

LeonInfo19

Bekanntes Mitglied
Ok schade:(
Ich habe das Programm so verbessert:
Java:
ublic static void binomLehr(int n) {
        int speicher=n;
        double ergebnis=1.0;
        String summe="";
        int hilf=1;
     
        for(int k=0; k<=n; k++) {
         
            if(k==0) ergebnis=1;
            else {
             hilf=k;
            while(k!=0) {
             
                ergebnis=ergebnis*((double)n/hilf);   //Binomialkoeffizient
                hilf--;
                n--;
         
            }
        n=speicher;
            }
        summe=summe +(int) ergebnis + "a" + "^" + (n-k)+ " + " +(int) ergebnis + "b" + "^" + k;
     
        }
     
        System.out.println(summe);
     
     
     
    }
}

Aber jetzt besteht das Problem, dass ich ja die gemischten Terme nicht am Ende hinbekomme. Wie kann man das machen?
 

LeonInfo19

Bekanntes Mitglied
Ich wollte doch nicht die Lösung, sondern vllt etwas Unterstützung :). Soll ich das Konkatinieren am Ende für a und b aufteilen.? Oder gibt es da etwas besseres?
 

Meniskusschaden

Top Contributor
Es gibt nicht viele Programme die Termumformungen können sogar bei Mathematik der 5. Klasse...
Ich glaube, er möchte im Grunde genommen nur die n-te Zeile des Pascalschen Dreiecks ausgeben. Termumformungen sehe ich da noch nicht als Anforderung.
Ich wollte doch nicht die Lösung, sondern vllt etwas Unterstützung :). Soll ich das Konkatinieren am Ende für a und b aufteilen.? Oder gibt es da etwas besseres?
Du hängst schon wieder in einer Endlosschleife fest. Wenn die while-Bedingung einmal zutrifft, wird die Schleife nie wieder verlassen, weil k sich nicht ändert. Ich würde mich erst einmal darauf konzentrieren, überhaupt die korrekten Koeffizienten zu ermitteln. Erst danach würde ich mir anschauen, wie man das zu dem gewünschten Ergebnisstring aufbereiten kann.
 

LeonInfo19

Bekanntes Mitglied
Ich habe vergessen das k in der while Bedingung durch hilf zu ersetzen:
Java:
public static void binomLehr(int n) {
                   
                   int speicher=n;
                   double ergebnis=1.0;
                   String summe="";
                   int hilf=1;
               
                   for(int k=0; k<=n; k++) {
                   
                       if(k==0) ergebnis=1;
                       
                       else {
                           hilf=k;
                           
                           while(hilf!=0) {
                       
                               ergebnis=ergebnis*((double)n/hilf);   //Binomialkoeffizient
                               hilf--;
                               n--;
                           }
                       n=speicher;
                       }
                   
                       
                   }
               }         
            }
So muss es doch gehen. Wie würdest du dann weitermachen. Ist ads Aufspalten von a und b sinnvoll?
 

LeonInfo19

Bekanntes Mitglied
Das sollte ja erstmal der Rumpf für die richtigen Koeffizienten sein für Meniskusschaden.
Die Methode soll dann dann das entprechend Ausmultiplizierte von( a+b)^n ausgeben. Ich weis, dass es bei void keinen Rückgabe gibt mit return, aber ich will direkt die Summe ausgeben, wenn ich die Methode aufrufe.
Ich beschäftige mich seit November damit.
 

LeonInfo19

Bekanntes Mitglied
Ja stimmt. Ich muss ergebnis wieder zurücksetzen.
Java:
public static void binomLehr(int n) {
                  
                   int speicher=n;
                   double ergebnis=1.0;
                   String summe="";
                   int hilf=1;
              
                   for(int k=0; k<=n; k++) {
                  
                       if(k==0) ergebnis=1;
                      
                       else {
                           hilf=k;
                          
                           while(hilf!=0) {
                      
                               ergebnis=ergebnis*((double)n/hilf);   //Binomialkoeffizient
                               hilf--;
                               n--;
                           }
                       n=speicher;
                       }
                  
                       ergebnis=1;
                   }
               }       
            }
Jetzt müsste es doch gehen. Wie würdest du weitermachen?
 

httpdigest

Top Contributor
Hab gerade mal meine Lösung zum Ausrechnen der n-ten Zeile des Pascal'schen Dreiecks genommen und schnell eine Lösung zusammengebaut, die du vielleicht zum Validieren deiner Lösung nehmen kannst:
Java:
import static java.util.stream.IntStream.*;
import static java.util.stream.Collectors.*;
public class Binomial {
  public static String binomialString(int n) {
    return rangeClosed(0, n).mapToObj(k -> {
      // Binomialkoeffizient (n k) ausrechnen:
      int f = range(0, k).reduce(1, (r, j) -> r * (n - j) / (j + 1));
      // Mathematischen Ausdruck zusammensetzen:
      return n == 0 ? "1" : // <- Fall für n == 0 mit nur 1
             (f > 1 ? f + "*" : "") // <- f *
           + (n > k ? "a" + (n - k > 1 ? "^" + (n - k) : "") : "") // <- a^(n-k)
           + (n > k && k > 0 ? "*" : "") // <- '*' zwischen a und b
           + (k > 0 ? "b" + (k > 1 ? "^" + k : "") : ""); // b^k
    }).collect(joining(" + "));
  }
}
 

Meniskusschaden

Top Contributor
zt müsste es doch gehen. Wie würdest du weitermachen?
Eigentlich kannst du jetzt so weiter machen, wie du es ursprünglich geplant hattest und an der Stelle, an der du einen neuen Koeffizienten bekommst, den Ergebnisstring um einen Term erweitern. Da würde ich auch erst einmal ein mathematisch korrektes Ergebnis anstreben und wenn das funktioniert noch etwas verfeinern, damit "^0"-Ausdrücke etc. verschwinden, so wie @httpdigest es demonstriert hat. Das Hauptproblem war ja nicht die String-Konkatenation, sondern die Endlosschleifen und falschen Koeffizienten.
 

LeonInfo19

Bekanntes Mitglied
Ich habe das Problem, dass ich jetzt am Ende ein + bekomme:
Java:
public static void binomFormel(int n) {
        int speicher=n;
        double ergebnis=1.0;
        String summe="";
        int hilfsvariable=0;
       
        for(int k=0; k<=n; k++) {
           
            if(k==0) ergebnis=1;
               
            else {
                hilfsvariable=k;
                while(hilfsvariable!=0) {
               
                    ergebnis=ergebnis*((double)n/hilfsvariable);   //Binomialkoeffizient
                    hilfsvariable--;
                    n--;
           
                }
                n=speicher;
            }
            summe=summe +(int) ergebnis + "a" + "^" + (n-k)+ (int)ergebnis + "b" + "^" + k +" + ";   
       
            ergebnis=1;
        }
       
        System.out.println(summe);
       
       
       
    }
}
Wie bekomme ich das weg?
 

LeonInfo19

Bekanntes Mitglied
Ok so meinst du das?
Java:
    public static void binomFormel(int n) {
        int speicher=n;
        double ergebnis=1.0;
        String summe="";
        int hilfsvariable=0;
      
        for(int k=0; k<=n; k++) {
          
            if(k==0) {
                ergebnis=1;
                summe=summe+"a" + "^" + (n-k)+  "b" + "^" + k;  
            }
              
            else {
                hilfsvariable=k;
                while(hilfsvariable!=0) {
              
                    ergebnis=ergebnis*((double)n/hilfsvariable);   //Binomialkoeffizient
                    hilfsvariable--;
                    n--;
          
                }
                n=speicher;
            }
            summe= summe + " + " +  +(int) ergebnis + "a" + "^" + (n-k)+ (int)ergebnis + "b" + "^" + k;
      
            ergebnis=1;
        }
      
        System.out.println(summe);
      
      
      
    }
}
 
Zuletzt bearbeitet:

Neue Themen


Oben