アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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ですが、除算による切り捨てが発生するため、除算を最後に行っています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/11 19:11

除法を使ってる段階で駄目です.


結果が整数になるとは限りません.
それと括弧の位置が間違ってます.
演算の優先順位を考えましょう.

なお,再帰でこれを書くときには,
パスカルの三角形を使います.
再帰の停止条件はもっとちょっと複雑になりますし,
工夫しないと再帰呼び出しの回数が多くなりすぎて
遅くて使い物にならなくなります.
    • good
    • 0
この回答へのお礼

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

comb1の中に結果をいれていくしかないのかなぁと思うのですが、入れ方がよく分からずにいます

お礼日時:2008/09/11 18:54

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/11 18:09

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