再帰を使用して配列の最大値を見つける

a が int 型のデータ要素が n 個ある配列であると仮定します。a の最大値を見つける再帰関数を作成してみてください。


再帰!

1. パラメータを決定します。配列はコンテナであり、間違いなく最初のパラメータです。配列内の最大数値を常に探しています。2 つの数値の比較を避けることはできません。配列内のすべての数値が確実に比較されるように配列を走査するため、配列の添え字も渡す必要があります。しかし、添字を渡すだけでは、添字なしではすべての数値を走査できないため、再帰呼び出しを開始する方法がまだありません。そこで、2 つの添字を渡して見てみましょう。1 つの添字は配列の左端の添字を表し、もう 1 つは配列の右端の添字を表します。再帰呼び出し中に、2 つの添字は徐々に近づき、すべての添字をたどることができます配列内の数値。要約すると、3 つのパラメータ: 配列、左添字、右添字
2. パラメータの規則。配列はコンテナとして機能し、再帰関数で演算される数値は常に配列内にあるため、配列を世代から世代へと受け渡す必要があります。配列内のすべての数値を走査する必要があり、添え字が 2 つあり、両方の添え字が次のとおりである必要があります。ルールは次のとおりです。

もう一度コードを見てください。

3. 再帰的エクスポート。再帰関数は配列を半分に折り続けますが、2 つの数に達するとそれ以上半分に折り畳むことができなくなり、結果が出力されます。

以下は完全なコードとコメントです。

コード:

#include<stdio.h>
#include<stdlib.h>
/*求数组中最大值*/
int getMax(int arr[], int left,int height) //数组容器,左标,右标
{
    
    
    /*如果左标和右标相邻了,返回两个数中大的那个数*/
    if (height - left < 2) {
    
    
        if (arr[left] > arr[height])
            return arr[left];
        else
            return arr[height];
    }
    else    //如果两标之间还有几个数,继续拆分,直到左标和右标相邻
    {
    
    
        int mid = (left + height) / 2;
        int max1 = getMax(arr, left, mid);      //在左标到中间下标之间找最大值,左半部分
        int max2 = getMax(arr, mid + 1, height);//在中间下标到右标之间找最大值。右半部分
        if (max1 > max2)  //返回在左半部分找出的最大值和右半部分找出的最大值较大的那一个
            return max1;
        else
            return max2;
    }
}
int main()
{
    
    
    int n,arr[100];
    printf("数组有多少个数:");
    scanf_s("%d", &n);
    printf("请输入这些数:");
    for (int i = 0; i < n; i++)
        scanf_s("%d", &arr[i]);
    int max = getMax(arr, 0, n-1);
    printf("数组中最大的数为:%d\n", max);
    system("pause");
    return 0;
}

操作結果:


テスト 1



テスト2



テスト 3



コード コンパイラー: Visual Studio 2017
はい、さようなら

おすすめ

転載: blog.csdn.net/weixin_44898710/article/details/107020374