Java 使用列表递归查找最大值

Java 使用列表递归查找最大值,java,list,recursion,Java,List,Recursion,我尝试编写的这个方法在列表中查找整数的最大值,对于赋值,我必须使用递归。我想我理解递归的概念,但是使用列表或数组进行递归是我不理解的。是否总是需要将列表或数组一分为二?无论如何,这段代码可以编译,但我在下面评论的一行中得到了一个IndexOutOfBounds错误。它看起来有点像我应该做的吗 public static final int findMaxRecursively(List<Integer> numbers) { int max = 0; if(numbers

我尝试编写的这个方法在列表中查找整数的最大值,对于赋值,我必须使用递归。我想我理解递归的概念,但是使用列表或数组进行递归是我不理解的。是否总是需要将列表或数组一分为二?无论如何,这段代码可以编译,但我在下面评论的一行中得到了一个IndexOutOfBounds错误。它看起来有点像我应该做的吗

public static final int findMaxRecursively(List<Integer> numbers) {
int max = 0;

     if(numbers.size() == 1)
       return numbers.size();

     List<Integer> bottomHalf = new ArrayList<Integer>(numbers.size()/2);
     for (int i= 0; i<numbers.size()/2;i++){
         if (bottomHalf.get(i) > max) // here's where the IndexOutOfBounds error occurs
          max = bottomHalf.get(i);
          }
          findMaxRecursively(bottomHalf);

     List<Integer> topHalf = new ArrayList<Integer>(numbers.size()/2);
     for(int i = numbers.size()/2; i< numbers.size(); i++){
         if (topHalf.get(i) > max)   
         max = topHalf.get(i);
    }
         findMaxRecursively(topHalf);

         return max;
}
公共静态final int findmax递归(列表编号){
int max=0;
if(numbers.size()==1)
返回数字。size();
List bottomHalf=newarraylist(numbers.size()/2);
for(int i=0;i max)//这里是IndexOutOfBounds错误发生的地方
最大值=下半部分。获取(i);
}
递归查找最大值(下半部分);
List topHalf=新的ArrayList(numbers.size()/2);
对于(int i=numbers.size()/2;i最大值)
最大值=上半部分。获取(i);
}
递归查找最大值(上半部分);
返回最大值;
}

您的递归调用毫无意义,因为您向它们传递的是空列表,即使它们返回了正确的值,您也没有对返回的值执行任何操作

为了递归地找到max元素,应该拆分列表。最有效的分割是分成两个相等的部分

通过
新建ArrayList(numbers.size()/2)
创建列表不会将原始列表的一半元素复制到此列表。它只是创建一个空列表,其初始容量是原始列表大小的一半。 您可以使用
列表子列表(int-fromIndex,int-toIndex)
以获取列表部分的视图

numbers.size()==1
时,应该返回
numbers.get(0)
而不是
numbers.size()

最后,使用for循环无法达到递归解决方案的目的。在递归解决方案中,只需进行两次递归调用,以获取下半部分和上半部分的最大值,然后比较两个返回值并返回较大的值

public static final int findMaxRecursively(List<Integer> numbers) 
{
     if(numbers.size() == 1)
         return numbers.get(0);

     List<Integer> bottomHalf = numbers.subList(0,numbers.size()/2);
     int bottom = findMaxRecursively(bottomHalf);

     List<Integer> topHalf = numbers.subList(numbers.size()/2,numbers.size());
     int top = findMaxRecursively(topHalf);

     return top>bottom?top:bottom;
}
公共静态final int findmax递归(列表编号)
{
if(numbers.size()==1)
返回数字。获取(0);
List bottomHalf=numbers.subList(0,numbers.size()/2);
int bottom=findmax递归(bottomHalf);
List tophald=numbers.subList(numbers.size()/2,numbers.size());
int top=findmax递归(上半部分);
返回顶部>底部?顶部:底部;
}

从文档中,
E get(int index)抛出:IndexOutOfBoundsException-如果索引超出范围(index<0 | | index>=size())
即使你做了
ListExcellent,谢谢!我不知道subList方法,但这很有意义。