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