1

私は線形再帰を理解し始めていませんでした、そしてそれから私はソートアルゴリズムを練習していると思いました、そしてそれからクイックソートは私が再帰に問題を抱えていたところです。そこで、オンラインで見つけた2進数の合計など、より単純なものを使用することにしました。すべての関数呼び出しと同様に、再帰は一度に1つずつ実行され、同時には実行されないことを理解しています(これはマルチスレッドが行うことですが、トレースするときは問題になりません)。したがって、再帰呼び出しBの前にすべての再帰呼び出しAを実行する必要がありますが、ミックスで迷子になります。誰かがそれを完全にトレースしてもかまいませんか。たとえば、私が使用したサイズはn = 9で、単純にするために要素はすべて1です。

/**
 * Sums an integer array using binary recursion.
 * @param arr, an integer array
 * @param i starting index
 * @param n size of the array
 * floor(x) is largest integer <= x
 * ceil(x) is smallest integer >= x
 */
public int binarySum(int arr[], int i, int n) {
    if (n == 1)
        return arr[i];
    return binarySum(arr, i, ceil(n/2)) + binarySum(arr,i + ceil(n/2), floor(n/2));
}
4

2 に答える 2

2

私が個人的に行っているのは、サイズ 2 の配列から始めることです。要素は 2 つあります。

return binarySum(arr, i, ceil(n/2)) + binarySum(arr,i + ceil(n/2), floor(n/2)) は、配列を 2 つに分割して 2 つの要素を追加するだけです。- ケース 1

現在、この些細な開始点は、より高いケースの再帰の最低レベルになります。

ここで n = 4 を増やします。配列は 2 に分割されます: 0-2 と 2-4 のインデックス。

インデックス 0 から 2 内の 2 つの要素がケース 1 に追加され、インデックス 2 から 4 に追加された 2 つの要素も追加されます。

この場合、これら 2 つの結果が追加されます。

これで、再帰手法をより理解できるようになりました。この場合のように、ボトムアップを理解する方が簡単な場合もあります!

今あなたの質問に9つの要素の配列を考えてみましょう: 1 2 3 4 5 6 7 8 9

n = 9 => ceil(9/2) = 5、床(9/2) = 4

これで、binarySum(array, 0, 9) の最初の呼び出し (トップ コール)

現在 n = サイズは 1 ではありません

したがって、再帰呼び出し....

戻り値 binarySum(配列, 0, 5) + binarySum(配列, 5, 4)

最初の binarySum(array, 0 ,5) は配列の最初の 5 要素を操作し、2 番目の binarySum(array,5,4) は配列の最後の 4 要素を操作します。

したがって、配列の分割は次のようになります。 1 2 3 4 5 | 6 7 8 9

最初の関数は要素の合計を求めます: 1 2 3 4 5

2 番目の関数は、要素 6 7 8 9 の合計を求めます。

これら 2 つが一緒に追加され、トップ コールに対する応答として返されます。

この 1+2+3+4+5 と 6+7+8+9 はどのように機能するのでしょうか? もう一度再帰します....

トレースは次のようになります

                            1 2 3 4 5 | 6 7 8 9

             1 2 3 | 4 5                          6 7 | 8 9

     1 2 | 3              4 | 5            6 | 7            8 | 9

[1 | 2] _ __ [3] _ __ [4 5] _ __[6 7]__ _ [8 9]

ここまでは問題ありません。関数を再帰的に呼び出しているだけです。

しかし今、私たちは基本的なケースにぶつかりました!

if (n == 1) return arr[i];

[1 + 2] _ ___[3]__ _ _ [4 + 5] _ ___[6 + 7]__ _ _ [8 + 9]

[3 + 3] _ ___ [9] __ _ _ [13 + 17]

      [6          +           9]                      [30]

                  [15                +                 30] 

                                   [45]  

これは合計です。

したがって、問題の主要なインスタンスに何が行われるかを理解するために、問題のマイナーなインスタンスに同じことが起こることを確認できます。

于 2012-06-11T06:44:29.297 に答える
0

この では、Java でのトレースを使用したバイナリ サムについて説明します

トレースは配列のインデックスに基づいています。ここで、0 は開始インデックスであり、8 は配列の長さです。

ここに画像の説明を入力

于 2014-07-31T17:04:26.727 に答える