2016-04-28 5 views
1

Ich habe folgendes Programm, das den Binomialkoeffizienten von zwei ganzen Zahlen berechnet. Aber ich möchte das Programm ändern, dass es berechnet und nur die notwendigen Koeffizienten für die Lösung speichert. Das Problem ist, dass ich im Moment wirklich keine Ahnung habe, wie es geht. The CodeJava: Binomialkoeffizienten berechnen

public static long binomialIteration(int n, int k) 


{ 
    if(k<0 || n<k) 
    { 
     return 0; 
    } 
    long[][] h= new long[n+1][n+1]; 
    for(int i=0; i<=n; i++) 
    { 
     h[i][0]=h[i][i]=1;  
    } 
    for(int i=1;i<=n;i++) 
    { 
     for(int j=0; j<=i; j++) 
     { 
      h[i][j] = (j==0 ? 0: h[i-1][j-1]) + (i == j ? 0 : h[i-1][j]); 
     } 
    } 
    return h[n][k]; 
} 
+2

Code zur Frage hinzufügen – Hosseini

+2

Warum setzen Sie hier einen Screenshot ein. Fügen Sie einfach Ihren Code ein ... –

+1

Wenn Sie einen guten Hinweis darauf haben möchten, wie Sie einen effizienten Weg finden, Ihr Problem zu lösen, sollten Sie sich mit dynamischer Programmierung beschäftigen (es ist ein Paradigma, das Ihnen sagt, dass Sie Werte, die Sie bereits berechnet haben, speichern) um zu vermeiden, sie erneut zu berechnen), überprüfen Sie diese Verbindungen: [Pseudocode] (http://www.csl.mtu.edu/cs4321/www/Lectures/Lecture%2015%20-%20Dynamic%20Programming%20Binomial%20Coefficients .htm) oder [ein anderer Weg (Implementierung)] (http://stackoverflow.com/questions/28919286/binomial-coefficient-algorithm-using-dynamic-programming-and-a-single-dimensiona) – Simonlbc

Antwort

2

Was ist mit diesem Code from this site

private static long binomial(int n, int k) 
    { 
     if (k>n-k) 
      k=n-k; 

     long b=1; 
     for (int i=1, m=n; i<=k; i++, m--) 
      b=b*m/i; 
     return b; 
    } 
1

Wollen Sie gesamten Code halten? Weil Sie können auch den binomischen Koeffizienten rekursiv berechnen, die Ihre Funktion auf diese 4 Zeilen reduzieren würde:

static long binomi(int n, int k) { 
     if ((n == k) || (k == 0)) 
      return 1; 
     else 
      return binomi(n - 1, k) + binomi(n - 1, k - 1); 
    } 
0

Sie sagen nicht, welche youi Notwendigkeit Koeffizienten. Wenn Sie für ein festes N C (N, n) benötigen, können Sie den folgenden C-Code übersetzen, der ein eindimensionales Array verwendet. Nach dem Aufruf C [n] wird der Binomialkoeffizient C (N, n) für 0 < = m halten < = N, solange N höchstens 66 ist - wenn Sie größer benötigen N Sie ein verwenden müssen Integraler Typ mit mehr Bits.

static int64_t* pascals_triangle(int N) 
{ 
int n,k; 
int64_t* C = calloc(N+1, sizeof *C); 
    for(n=0; n<=N; ++n) 
    { C[n] = 1; 
     k = n; 
     while(--k>0) 
     { C[k] += C[k-1]; 
     } 
    } 
    return C; 
} 
Verwandte Themen