3

私はこの機能を持っています:

int max(int arr[], int size)
{
    size--;
    if(size > 0)
    {
        int max = max(arr, size);
        if(arr[max] > arr[size]) return max;
    }
    return size;
}

もちろん、それは機能します。私の質問は - これはどのように機能しますか? 誰かが私にこれを段階的に説明してもらえますか? 今日は土曜日なので、誰かが少し時間があるかもしれません :DI 特に if ブロックのこれらの 2 行を意味します。

4

4 に答える 4

2

ここに画像の説明を入力

図の書式が悪くてすみません

于 2013-01-19T14:45:04.130 に答える
2

コードは次のとおりです。

1 int max(int arr[], int size){
2     size--;
3     if(size > 0){
4         int max = max(arr, size);
5         if(arr[max] > arr[size]) return max;
6     }
7     return size;
8 }

配列とその配列のサイズ (または長さ) を渡して呼び出します。

コードがヒットする最初の重要なポイントは、再帰的に自分自身を呼び出す 4 行目です。しかし、2 行目では、サイズが 1 減っていることに注意してください。したがって、サイズは、関数の現在の呼び出しによって考慮される配列の要素を参照するインデックスであると考えることができます。

これは、最終的に配列のサイズがゼロになり、配列の最初の要素が表示されることを意味します。この時点で 3 行目から 6 行目はスキップされ、0 が返されます。

再帰呼び出しの 1 つが戻ると、4 行目に戻ります。

最初のリターンの場合、これはint max = 0;.

ここで、0 番目の要素と最初の要素を比較しています。どちらか大きい方のインデックスを返します。次の比較は、2 番目の要素と、最初の 2 つの要素のうち大きい方との間で行われます。

これは、すべての再帰呼び出しが返されるまで続き、その時点で最大要素のインデックスが呼び出し関数に返されます。

次に、明確にするためreturn size;に に置き換える必要があることに注意してください。return 0

于 2013-01-19T14:28:18.227 に答える
2

arr[] = [1,2]手段を呼び出す問題を順を追って見てみましょうmax(arr[], 2)

size--; // 2-1 = 1
if(size > 0) //True
    {
        int max = max(arr, size); //Going into the recursive call 

これは再帰的な実行です:

    size--; // Now 1-1 = 0
    if(size > 0) //False
    return size; //0 returned

呼び出し関数に戻ります。

        int max = 0 //From return
        if(arr[max] > arr[size]) //arr[0]>arr[1] which is false 
    }
    return size; //Now, control reaches here and 1 is passed back to the calling scope
}
于 2013-01-19T14:29:32.603 に答える
2

たとえば、次の配列を見てみましょう。

int arr[] = { 42, 54, 23 };
max(arr, 3);

この関数は、現在の要素の最大値を以前のすべての要素の最大値と照合することによって機能します。スタック呼び出しの表現は次のとおりです。

max(arr, 3)
    max(arr, 2)
        max(arr, 1)
            return 0
        arr[0] (arr[max] = 42) <= arr[0] (arr[size] = 42) => return size (0)
    arr[0] (arr[max] = 42) <= arr[1] (arr[size] = 54) => return size (1)
arr[1] (arr[max] = 54) > arr[2] (arr[size] = 23) => return max (1)

注意:変数と関数の両方に同じ識別子を付けることはお勧めできません。

于 2013-01-19T14:24:07.163 に答える