プロが教えるわが家の防犯対策術!

nCrの計算のプログラムを
nCr=n!/(r!(n-r)!)
を用いて再帰的関数を使って書いたのですが、もし
nCr=n(n-1)(n-2)・・・(n-r+1)/r!
であることを用いて、nからmまでの掛算を実現する2引数の関数を定義して、再帰的関数呼び出しを用いたnCrのプログラムを作成するとしたらどうなるでしょうか。
関数x!の定義は、関数の宣言をlong factorial(int x)として、
if (x==0)
return(1);
else
return(x*factorial(x-1));
となることは分かるのですが、
2引数の関数m(m+1)・・・nはどう作れば良いのか全くわからないので、プログラムが書けない状態です。アドバイスお願いします。

A 回答 (3件)

いまいち、質問の意味がわかりにくいのですが、mからnまでの積を再帰的に計算する関数を作りたいのでしょうか? それでしたら



int factorial (int m, int n) {

 if (m == n)
  return m;
 else
  return m * factorial(m + 1, n);

}

で良さそうですが…。
    • good
    • 0
この回答へのお礼

できました!
factorial(m+1,n)というところに気づかない未熟者でした。ご回答、ありがとうございました。

お礼日時:2003/12/02 16:09

再帰を用いて nCr : comb(n,r) を求めるのなら、



comb(n,r) = comb(n-1, r-1) + comb(n-1, r)
を使った方が楽ではないかと。

int comb(int n, int r) {
if ( n == r ) return 1;
if ( r == 0 ) return 1;
return comb(n-1, r-1) + comb(n-1, r);
}
    • good
    • 0
この回答へのお礼

これは気づきませんでした。そうですね、漸化式の形ででもできますね。ありがとうございます。

お礼日時:2003/12/02 16:11

nCr=n(n-1)(n-2)・・・(n-r+1)/r!


で「n(n-1)(n-2)・・・(n-r+1)」は
nを基準にr回ループさせればいいのではないでしょうか?
ベーシックでいいでしょうか?
というより、どんなプログラムでもforはあると思うのでそれを用いればよいかと思います。
ベーシックしかわからないのでベーシックで記述しておきます。n,rはすでに入力されているとして、メインプログラムだけ記述しておきます。

10 b=1;d=1
20 for a=1 to r
30 b=b*(n-a+1)
40 next a
50 for c=1 to r
60 d=d*c
70 next c
80 e=b/d

で、答えはeとなりませんか?
    • good
    • 0
この回答へのお礼

すみません、私はベ-シック知らないんです。どうも、ご回答ありがとうございました。

お礼日時:2003/12/02 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!