LoginSignup
0
0

More than 1 year has passed since last update.

【C言語】再帰で組合せを求めるプログラムを作ってみた

Posted at

初めまして。僕はプログラミングの勉強中です。

再帰プログラムを作りたいと思い、再帰で組合せを求めるプログラムを挑戦してみました。

実際に作成したプログラム

saiki3.c
#include <stdio.h>

//順列を求める
int N(int n, int r){ //関数Nにnとrを入れたので、nとrを両方とも使える
	int m;
	if(r == 0){
		return 1;
	}
	m = N(n - 1, r - 1);
	return n * m;
}

//rの階乗を求める
int R(int r){ //関数Rにrだけ入れたので、rだけしか使えない
	int m;
	if(r == 0){
		return 1;
	}
	m = R(r - 1);
	return r * m;
}	

//組合せを求める
int NR(int n, int r){ //関数NRにnとrを入れたので、nとrを両方とも使える
	return N(n, r) / R(r);
}

int main ( void ){
	int n, r;
	printf("n>>");
	scanf("%d", &n);
	printf("r>>");
	scanf("%d", &r);
	printf("n : %d\n", N(n, r)); //関数Nにnとrを入れる
	printf("r : %d\n", R(r)); //関数Rにrだけ入れる
	printf("組み合わせは %d 個です", NR(n, r)); //関数NRにnとrを入れる
	return 0;
}
(結果)result.
n>>6
r>>3
n : 120
r : 6
組み合わせは 20 個です

こんな感じで作りました。再帰関数は初めて使いました。

失敗したこと

最初に作成したのは、int main(void)にN(n), R(r)を別々に入力しました。別々にしたためにscanf型のnとrに入力された数値がN(n)はnだけ、R(r)はrだけしか使えなかったためにint N(int n, int r)を入力したらエラーが表示されました。

(ダメな例)error.c
#include <stdio.h>

//順列を求める
int N(int n, int r){ //int main(void)でN関数にnだけしか入力されていないのでエラーになる!
	int m;
	if(r == 0){
		return 1;
	}
	m = N(n - 1, r - 1);
	return n * m;
}

//rの階乗を求める
int R(int r){ //関数Rにrだけ入れたので、rだけしか使えない
	int m;
	if(r == 0){
		return 1;
	}
	m = R(r - 1);
	return r * m;
}	

//組合せを求める
int NR(int n, int r){ //関数NRにnとrを入れたので、nとrを両方とも使える
	return N(n, r) / R(r);
}

int main ( void ){
    int n, r;
    printf("n>>");
    scanf("%d", &n);
    printf("r>>");
    scanf("%d", &r);
    printf("n : %d\n", N(n)); //← Nの関数はnだけしか使えない
    printf("r : %d\n", R(r)); //← Rの関数はrだけしか使えない
    printf("組み合わせは %d 個です", N(n), R(r));
    return 0;
}

最初はどうしてエラーが表示されたのか意味が分からなくて頭を抱えました。インターネットで再帰関数を使って作成しているプログラムを調べてみました。調べてみると。int nとint rを両方とも使いたければ、int main(void)のNの関数にnとrを入力すれば、解決することができました。

再帰関数は使ったばかりなので、まだまだ分からないことがあります。再帰関数を使いこなせるように他のプログラムを試しに作り、挑戦していきたいです。

説明は上手にできなくて分かりづらいな部分があると思います。分かりづらいな部分がありましたら教えてください。または、間違っている部分があれば教えていただけると嬉しいです。どうぞよろしくお願いします。

ここまで読んでいただきありがとうございます。次のプログラムを作成したら、また投稿したいと思います。お待ちください。ではまたね!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0