• ベストアンサー

nCrの計算

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はどう作れば良いのか全くわからないので、プログラムが書けない状態です。アドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

いまいち、質問の意味がわかりにくいのですが、mからnまでの積を再帰的に計算する関数を作りたいのでしょうか? それでしたら int factorial (int m, int n) {  if (m == n)   return m;  else   return m * factorial(m + 1, n); } で良さそうですが…。

MP4-18
質問者

お礼

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

その他の回答 (2)

回答No.3

再帰を用いて 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); }

MP4-18
質問者

お礼

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

noname#7289
noname#7289
回答No.1

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となりませんか?

MP4-18
質問者

お礼

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

関連するQ&A