有人可以解释一下递归是如何起作用的。我试着弄清楚每次递归调用时写下低,中,高。但我似乎在某种程度上犯了错误。可以请一些人告诉我步骤。我也是不明白在
中返回值的位置if(leftmax>rightmax){
return leftmax;
}
else
return rightmax;
以下是代码:
public class Maximum{
public static int max(int[] a,int low,int high){
int mid,leftmax,rightmax;
if(low==high)
return a[low];
else{
mid=(low+high)/2;
leftmax=max(a,low,mid);
rightmax=max(a,mid+1,high);
if(leftmax>rightmax){
return leftmax;}
else
return rightmax;
}
}
public static void main (String args[]){
int[] a={32,8,12};
System.out.println(max(a,0,2));
}
}
答案 0 :(得分:1)
所以看来这是着名的 Divide and Conquer 算法,用于查找元素,在本例中为最大元素。
该方法从此输入开始:
max(int[] a, int low, int hight)
a[] = { 32, 8, 12 }; //The target array. You want to find the maximum element in it.
low = 0; //The index of the array where you will start searching
high = 2; //The index of the array where you will stop searching
所以,基本上,低和高定义了一个" 范围",你将搜索内部的最大元素此范围,如果要搜索整个数组,则指定范围为索引0和最大可能索引,即数组的长度 - 1(请记住,索引从零,所以你需要减去偏移量)
方法中的第一个条件检查是否给出了包含一个元素的范围。在这种情况下,低和高将是相同的,因为它们引用数组上的相同索引。因此,您只需在索引中返回该特定元素( 您不必进行任何搜索,如果您在单元素范围内搜索最大元素,则最大元素是单个元素 )。返回 a [low] 或 a [high] 是相同的。
如果你给出了一个包含多个元素的范围,你可以进入 else 部分。
在这里,你得到范围的中间索引。
因此,如果您指定了从索引3(低)到索引7(高)的范围,那么中间索引将 5 。(( *(低+高)/ 2 * )
然后,您将范围划分为两个范围,左范围和右范围,它们都来自相同的原始范围,被分成两个。
然后,您对这两个范围中的每一个执行上述所有操作,直到同一时间您将分割这么多范围,最终会得到一个单元素范围 ,并将它返回。
让我们暂停一下。
查看代码,我们相应地将分割范围的返回值存储在 leftmax 和 rightmax 中,但由于您调用相同的方法,因此每个分割范围也将拥有它自己的 leftmax 和 rightmax 以及它自己的分割范围。
就像你潜水越来越深,表面是方法的初始执行。
最后一层深度是给出一个单元素范围(前一个分割的结果)。在这种情况下,该方法将停止调用自身,因为它实际上返回值。谁会抓住这个返回值? 上一级也可以非常深 ,这个深层次将捕获最后一级的返回值并在代码中进行比较,即返回最大值元素,并将这两个数字的最大元素返回到上面的级别,这将执行相同的操作,并将其返回到更高级别,并且依次打开然后,直到你到达 表面水平 ,并相应地分配两个最大数量的分割数组,然后检查这两个数字的最大值并将它们返回到你(你是最高级别的!)。
我希望我能清楚地解释整个过程并帮助你!!
答案 1 :(得分:0)
1 low=0 high=2 mid=1
2 low=0 high=1 mid=0
3 low=0 high=0 --> return a[0] --> leftmax == 32
4 low=1 high=1 --> return a[1] --> rightmax == 8
leftmax > rightmax --> return leftmax == 32
5 low=2 high=2 --> return a[2] --> rightmax == 12
leftmax > rightmax --> return leftmax == 32
max()函数的工作是:
low
和high
相等,则返回索引指向的值