質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

907閲覧

再帰の使い方について

kamecha

総合スコア41

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/09/14 22:25

###前提
c言語を書籍で勉強している学生です。
書籍には回答がないため、質問する回数が多くなりがちです。

###問題
異なるn個の整数からr個の整数を取り出す組み合わせの数n C rを求める関数を作成せよ。

lang

1int combination (int n, int r) {/* ... */}

なおn C r は以下のように定義される。
n C r = n-1 C r-1 + n-1 C r (ただし、n C 0 = n C n = 1, n C 1 = n)

###該当のソースコード

lang

1/*階乗値を求める */ 2int factorial (int n) 3{ 4 if(n < 0){ 5 return n * factorial(n - 1); 6 }else { 7 return 1; 8 } 9} 10 11/*組み合わせを求める*/ 12int combination (int n, int r) 13{ 14 return factorial(n) / factorial(r) / factorial(n - r); 15}

###疑問点
再帰を使うのは分かるのですが、どのように使えばいいのか分かりません。
n C r = n! / r!(n - r)! という性質を使って上記のコードを作成したのですが、上手く動作しませんでした。

###補足情報
書籍 : 新明解c言語 入門編
演習8-7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

なおn C r は以下のように定義される。

n C r = n-1 C r-1 + n-1 C r (ただし、n C 0 = n C n = 1, n C 1 = n)

すっげーヒントが書いてあるやん。これを忠実に実装すればいい。

C

1#include <stdio.h> 2 3int combination(int n, int r) { 4 5 /* nC0 = nCn = 1 */ 6 if ( r == 0 || n == r ) return 1; 7 8 /* nC1 = n */ 9 if ( r == 1 ) return n; 10 11 /* n-1Cr-1 + n-1Cr */ 12 return combination(n-1, r-1) + combination(n-1, r); 13} 14 15int main() { 16 int n, r; 17 for ( n = 1; n < 6; ++n ) { 18 for ( r = 0; r <= n; ++r ) { 19 printf("C(%d,%d) = %d\n", n, r, combination(n,r)); 20 } 21 printf("\n"); 22 } 23 return 0; 24}

投稿2017/09/14 22:46

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamecha

2017/09/15 22:19

有り難うございます。 なるほど、その様にすればいいのですね。 頑張って理解します!
guest

0

理論上はn!/(r!(n-r)!)でも実装できますが、C言語ではintの限界が早々に来てしまうので、狙ったとおりには動かなくなります(Rubyのように、整数の桁数が無限に入る環境なら、これでも動きます)。

…というより、

なおn C r は以下のように定義される。

n C r = n-1 C r-1 + n-1 C r (ただし、n C 0 = n C n = 1, n C 1 = n)

と書いてある以上、こちらに従って実装するのが題意ではないかと思うのですが。

投稿2017/09/14 22:40

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamecha

2017/09/15 22:13

その通りなのですが、どうしても実装の仕方が分からなかったので、その段階で分かっていた階乗値を使って何とか動くプログラムを作ろうとした結果このようになってしまいました…
maisumakun

2017/09/15 22:17

再帰を使った階乗の実装が(いくつか問題があるけど)できているのに、再帰的に定義が書かれているnCrのほうが「どうしてもわからない」というのが、よくわからなかったです。
kamecha

2017/09/15 22:24

高校1年生の頃 n C r は n! / r! / (n - r)!と計算していたため、 n C r = n-1 C r-1 + n-1 C r という定義式がどの様な計算をしているか、よく分からなかった為です。 (高1の頃、理解できていれば…)
maisumakun

2017/09/15 22:26

「パスカルの三角形」で調べてみてください。
kamecha

2017/09/15 22:36

有り難うございます。 この分野は苦手だった為、復習もかねて理解していこうと思います。
guest

0

効率的な方法は他者の回答を参考にしてください。本質はおそらくここです。不等号よくみて!

if(n < 0)

投稿2017/09/15 07:04

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamecha

2017/09/15 22:18

有り難うございます。 if (n > 0)に変更すると上手く動作してくれました。 これで取り合えず動くプログラムは作れました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問