递归了解如何调用该方法

时间:2014-06-05 18:00:29

标签: java recursion

有人可以解释一下递归是如何起作用的。我试着弄清楚每次递归调用时写下低,中,高。但我似乎在某种程度上犯了错误。可以请一些人告诉我步骤。我也是不明白在

中返回值的位置
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));
    }
}

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()函数的工作是:

  • 如果lowhigh相等,则返回索引指向的值
  • 否则,将我们正在查看的数组部分划分为两个部分,并在两部分上递归调用max()。然后返回两次调用返回的较大值。