- ベストアンサー
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はどう作れば良いのか全くわからないので、プログラムが書けない状態です。アドバイスお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いまいち、質問の意味がわかりにくいのですが、mからnまでの積を再帰的に計算する関数を作りたいのでしょうか? それでしたら int factorial (int m, int n) { if (m == n) return m; else return m * factorial(m + 1, n); } で良さそうですが…。
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
再帰を用いて 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); }
お礼
これは気づきませんでした。そうですね、漸化式の形ででもできますね。ありがとうございます。
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となりませんか?
お礼
すみません、私はベ-シック知らないんです。どうも、ご回答ありがとうございました。
お礼
できました! factorial(m+1,n)というところに気づかない未熟者でした。ご回答、ありがとうございました。