2016-02-01 5 views
5

だから、十一次の二項係数を出力するプログラムを書く必要があります。私は必要なことをするこのコードを見つけましたが、なぜそれが機能するのか理解しようとしています。Cの二項係数プログラムの説明

#include<stdio.h> 

int binomialCoeff(int n, int k) 
{ 
    if(k == 0)return 1; 
    if(n <= k) return 0; 

    return (n*binomialCoeff(n-1,k-1))/k; 
} 

int main() 
{ 
    int k; 
    for(k=10;k>=0;k-=1) 
    { 
      printf("%d\n", binomialCoeff(10, k)); 
    } 

int mainが動作する理由は、binomialCoeffの計算方法がわかりません。私はこのコーディングのすべてに比較的新しいので、助けてくれてありがとう!

+2

数式、再帰、またはC構文は理解できません。 – Jeff

+0

私は(n * binomialCoeff(n-1、k-1))/ kが数式n!/((n-k)!k!)と等しくないことを理解していません。 – Rick

+2

前者は再帰を使用します。後者の式の再帰的なバージョンを派生させると、接続が見えると思います。 – Jeff

答えて

5

これは実際にかなりエレガントです。

関数binomialCoeffは、2つの基本条件を持つ再帰関数です。 k == 0の場合は、1に戻ります。 n<=kの場合は0を返します。そうでない場合は、nkから1つを引いて同じ関数を呼び出します。これは

のn *(binomialCoeff(N-1、K-1))/ Kで

を結果として繰り返されるので、Nは10であり、Kはあなたが

10*(binomialCoeff(9,6)/7) 

を得る7

であると言います物事を単純に保つために、binomialCoeffがres1と呼ばれて初めて電話することができます。これに物事を簡素化:自身が

我々は

10*(res2/6) 
を取得するので、 res2

を呼び出すことができます

9*(binomialCoeff(8,5)/6) 

その結果binomialCoeff

を呼び出し

10*(res1/6) 

けど

などとなります。一連のnが一緒に乗算されます。

+2

徹底的な説明をありがとう、私はそれを今理解する! – Rick