使用二进制递归求和数组元素

时间:2012-06-09 21:01:50

标签: recursion binary trace

我没有开始理解线性递归,然后我认为我在排序算法上练习,然后快速排序是我在递归方面遇到麻烦的地方。所以我决定使用一个更简单的例子,我在网上找到的二进制数。我理解递归,就像所有函数调用一样,每次执行一次而不是同时执行(这是多线程所做的,但在跟踪时不是我关心的)。所以我需要执行所有递归调用A BEFORE递归调用B,但是我在混合中迷失了。有没有人介意完全追踪它。例如我使用了大小,n = 9,其中elems都是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));
}

2 个答案:

答案 0 :(得分:2)

我个人所做的是从一个大小为2的数组开始。有两个元素。

返回binarySum(arr,i,ceil(n / 2))+ binarySum(arr,i + ceil(n / 2),floor(n / 2))除了将数组拆分为2并添加两个要素。 - 案例1

现在,这个微不足道的起点将是较高案例递归的最低级别。

现在增加n = 4.数组被分成2:0-2和2-4的索引。

现在索引0到2中的2个元素在情况1中被添加,因此在索引2-4中添加的2个元素也是如此。

现在在这种情况下添加了这两个结果。

现在我们能够更好地理解递归技术,有时候在这种情况下更容易理解自下而上!

现在你的问题考虑一个由9个元素组成的数组:1 2 3 4 5 6 7 8 9

n = 9 =&gt; ceil(9/2)= 5,floor(9/2)= 4

现在第一次调用(top调用)binarySum(数组,0,9)

现在n = size不是1

因此递归调用....

返回binarySum(数组,0,5)+ binarySum(数组,5,4)

现在第一个binarySum(数组,0,5)在数组的前5个元素上运行,第二个binarySum(数组,5,4)在数组的最后4个元素上运行

因此阵列划分可以这样看: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

     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]  

这是总和。

因此,为了理解对问题的主要实例做了什么,你可以确定问题的次要实例会发生同样的事情。

答案 1 :(得分:0)

这个example用java中的跟踪解释了二进制和

跟踪基于数组的索引,其中0 - 是您的起始索引,8是数组的长度

enter image description here