- ベストアンサー
nCmの関数
C言語で、nCmを(n-m+1/m)*nCm-1として再起を利用して計算する関数を作りたいです int comb1(int n, int m){ if(m==0) return1; else return /********/; } /********/この部分を上手に使えば、(n-m+1/m)*nCm-1の再起する関数として動くようなのですが分からずにいます 回答の分かる方、宜しくお願いいたします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
以下のソースをコンパイルして実行して下さい。 ------------------------ #include <stdio.h> int comb1(int n,int m){ if (m==0){ return 1; }else{ // return((n-m+1)/m)*comb1(n,m-1); ・・・式1 return comb1(n,m-1)*(n-m+1)/m; } } main() { int a1,a2,a3,a4,a5; a1 = comb1(4,0); a2 = comb1(4,1); a3 = comb1(4,2); a4 = comb1(4,3); a5 = comb1(4,4); printf("a1=%d a2=%d a3=%d a4=%d a5=%d\n",a1,a2,a3,a4,a5); return 0; } ----------------- 本来、すなおに書けば式1ですが、除算による切り捨てが発生するため、除算を最後に行っています。
その他の回答 (2)
- kabaokaba
- ベストアンサー率51% (724/1416)
除法を使ってる段階で駄目です. 結果が整数になるとは限りません. それと括弧の位置が間違ってます. 演算の優先順位を考えましょう. なお,再帰でこれを書くときには, パスカルの三角形を使います. 再帰の停止条件はもっとちょっと複雑になりますし, 工夫しないと再帰呼び出しの回数が多くなりすぎて 遅くて使い物にならなくなります.
お礼
括弧の位置は間違えました 実際に使うかどうかではなく、あくまで試験問題のようなものだとお考えください(事実、過去問の1つです 「nCmを解くには(n-m+1)/m*nCm-1という方法がある、これを用いて/*****/の部分を埋めよ」という問題です 再帰を使えるかどうかを問う問題のようなので、実際に動かして小数点で困る場合や速度・オーバーフローなどは無視してかまわないようです comb1の中に結果をいれていくしかないのかなぁと思うのですが、入れ方がよく分からずにいます
- jacta
- ベストアンサー率26% (845/3158)
「再起」というのがよく分からないのですが、もしかして「再帰」のことでしょうか?
お礼
ああ、すみません 変換をミスしています 仰るとおり、再帰です mが0になるまでreturnでcomb1を呼び出し、(n-m+1/m)*nCm-1をやるようなのですがよく分からないのです
お礼
回答ありがとうございます おそらく、問題としての回答は式1なのだと思います こういった書き方でも動くのですね、非常に勉強になりました 本当にありがとうございます