我没有开始理解线性递归,然后我认为我在排序算法上练习,然后快速排序是我在递归方面遇到麻烦的地方。所以我决定使用一个更简单的例子,我在网上找到的二进制数。我理解递归,就像所有函数调用一样,每次执行一次而不是同时执行(这是多线程所做的,但在跟踪时不是我关心的)。所以我需要执行所有递归调用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));
}
答案 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)