2016-04-28 5 views
1

У меня есть следующая программа, вычисляющая биномиальный коэффициент двух целых чисел. Но я хочу изменить программу, что она вычисляет и сохраняет только необходимые коэффициенты для решения. Проблема в том, что я действительно не знаю, как это сделать, прямо сейчас. The CodeJava: вычисление биномиального коэффициента

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

, пожалуйста, добавьте код в вопрос – Hosseini

+2

Зачем вы размещаете скриншот здесь. Просто вставьте свой код ... –

+1

Если вы хотите получить какой-то хороший намек на то, как выяснить, как найти эффективный способ решения вашей проблемы, вы должны изучить динамическое программирование (это парадигма, которая подсказывает вам сохранить уже вычисленные значения, чтобы избежать их повторного использования), проверьте эти ссылки: [псевдокод] (http://www.csl.mtu.edu/cs4321/www/Lectures/Lecture%2015%20-%20Dynamic%20Programming%20Binomial%20Коэффициенты .htm) или [другой путь (реализация)] (http://stackoverflow.com/questions/28919286/binomial-coefficient-algorithm-using-dynamic-programming-and-a-single-dimensiona) – Simonlbc

ответ

2

Что об этом 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

ли вы хотите сохранить свой код в целом? Потому что вы можете также вычислить коэффициент двухмандатной рекурсивно, что бы уменьшить функцию этих 4-х линий:

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

Вы не говорите, какие коэффициенты Youi потребности. Если вам понадобится C (N, n) для некоторого фиксированного N, вы можете перевести код C ниже, в котором используется одномерный массив. После вызова C [n] будет удерживать биномиальный коэффициент C (N, n) для 0 < = m < = N, если N не более 66 - если вам нужно больше N, вам нужно будет использовать интегральный тип с большим количеством бит.

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; 
}