• ベストアンサー

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の再起する関数として動くようなのですが分からずにいます 回答の分かる方、宜しくお願いいたします

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.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ですが、除算による切り捨てが発生するため、除算を最後に行っています。

zun07
質問者

お礼

回答ありがとうございます おそらく、問題としての回答は式1なのだと思います こういった書き方でも動くのですね、非常に勉強になりました 本当にありがとうございます

その他の回答 (2)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

除法を使ってる段階で駄目です. 結果が整数になるとは限りません. それと括弧の位置が間違ってます. 演算の優先順位を考えましょう. なお,再帰でこれを書くときには, パスカルの三角形を使います. 再帰の停止条件はもっとちょっと複雑になりますし, 工夫しないと再帰呼び出しの回数が多くなりすぎて 遅くて使い物にならなくなります.

zun07
質問者

お礼

括弧の位置は間違えました 実際に使うかどうかではなく、あくまで試験問題のようなものだとお考えください(事実、過去問の1つです 「nCmを解くには(n-m+1)/m*nCm-1という方法がある、これを用いて/*****/の部分を埋めよ」という問題です 再帰を使えるかどうかを問う問題のようなので、実際に動かして小数点で困る場合や速度・オーバーフローなどは無視してかまわないようです comb1の中に結果をいれていくしかないのかなぁと思うのですが、入れ方がよく分からずにいます

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

「再起」というのがよく分からないのですが、もしかして「再帰」のことでしょうか?

zun07
質問者

お礼

ああ、すみません 変換をミスしています 仰るとおり、再帰です mが0になるまでreturnでcomb1を呼び出し、(n-m+1/m)*nCm-1をやるようなのですがよく分からないのです

関連するQ&A