【C言語】再帰関数を使った最大値と最小値の求め方(データの数が何個でもOK)

  • このエントリーをはてなブックマークに追加

データを配列に入れてbox=[1,2,3,・・・n]として最小値を求めるプログラムを作成する。

1.データ数が1のとき、box[0]が最小値となる
2.データ数が2のとき、box[0]をグループ1としbox[1]をグループ2として、グループ1の最小値とグループ2の最小値を比較し小さい方がデータの最小値となる。
3.データ数が3のとき、box[0]をグループ1としbox[1]~box[2]をグループ2として、グループ1の最小値とグループ2の最小値を比較し
小さい方がデータの最小値となる。
4.データ数が4のとき、box[0]をグループ1としbox[1]~box[3]をグループ2として、グループ1の最小値とグループ2の最小値を比較し
小さい方がデータの最小値となる。
5.データ数が5のとき、box[0]をグループ1としbox[1]~box[4]をグループ2として、グループ1の最小値とグループ2の最小値を比較し
小さい方がデータの最小値となる。
6.データ数が6のとき、box[0]をグループ1としbox[1]~box[5]をグループ2として、グループ1の最小値とグループ2の最小値を比較し
小さい方がデータの最小値となる。

このように要素数がnの整数配列の最小値は、一番左の要素box[0]をグループ1として
box[1]~box[n-1]のグループ2としてグループ1の最小値とグループ2の最小値を比較し
小さい方がデータの最小値となる。これによってデータ数が何個でも最小値を求められる。

同様にすると最大値も求められる。




//データの数が何でもOK
#include<stdio.h>
int max_of_array(int *, int);
int min_of_array(int *, int);

int main()
{

 int g[] = {1,-2,3,4,5,996,7,678,9,10,-11},pp;

 pp=sizeof(g) / sizeof(int);//gに入力した値の数

 printf("データの数:%d\n",pp);

 printf("最大値:%d\n", max_of_array(g, pp));

 printf("最小値:%d\n", min_of_array(g, pp));


 return 0;
}

//最小値を求める
int min_of_array(int *m, int n)//int nのnはデータの数である
{

 if(n==1){return m[0];}

 else{return (m[0] < min_of_array(m+1, n-1)) ? m[0] : min_of_array(m+1, n-1);}
}

//最大値を求める
int max_of_array(int *m, int n)
{

 if(n==1){return m[0];}

 else{return (m[0] > max_of_array(m+1, n-1)) ? m[0] : max_of_array(m+1, n-1);}
}

上記コードを実行する。

C:\>0515.exe
データの数:11
最大値:996
最小値:-11

これを改造してデータをscanfで読み込むようにする。


//データの数が何でもOK
#include<stdio.h>
int max_of_array(int *, int);
int min_of_array(int *, int);
#define N 400//入力するデータの数は400以下
int main()
{

 int g[N],pp,i;

 printf("データの数を入力せよ>>");

 scanf("%d",&pp);

 printf("データを1つずつ入力せよ\n");

 for(i=0;i<pp;i++){scanf("%d",&g[i]);}

 printf("最大値:%d\n", max_of_array(g, pp));

 printf("最小値:%d\n", min_of_array(g, pp));

 return 0;
}

//最小値を求める
int min_of_array(int *m, int n)
{

 if(n==1){return m[0];}

 else{return (m[0] < min_of_array(m+1, n-1)) ? m[0] : min_of_array(m+1, n-1);}
}

//最大値を求める
int max_of_array(int *m, int n)
{

 if(n==1){return m[0];}

 else{return (m[0] > max_of_array(m+1, n-1)) ? m[0] : max_of_array(m+1, n-1);}
}

上記コードを実行する。

C:\>0515.exe
データの数を入力せよ>>5
データを1つずつ入力せよ
32
53
24
-90
53
最大値:53
最小値:-90

この結果は正しい。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*