我有一个valorMaxim([1, 5, 252, 24, 7, 82, 3])
返回252的方法,我不知道怎么做,我一直在想,如果我可以减少数组长度。
public static int valorMaxim(int arr[]){
int max;
if(arr.length==1)
return arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] < arr[i+1]) {
max=arr[i+1];
return arr[i+1];
}
}
return valorMaxim(arr);
//Retorna el valor màxim en un array no buit d’enters.
}
2条答案
按热度按时间e0bqpujr1#
我将接受的答案修改为Finding Max value in an array using recursion。
按照您的建议(即每次调用递归方法时减少数组长度),我创建了一个长度比参数小1的方法参数副本,并删除了第一个元素,然后用数组副本递归调用方法。
bpsygsoo2#
基本上,递归的思想是:
1.如果数组长度为1,则返回唯一的元素;
1.否则,将数组拆分为
x
(第一个元素)和xs
(其余元素);1.找出
xs
中最大的元素,将其与x
比较,得出较大的值。有两种方法可以实现这样的“分裂”:
1.为
xs
创建部分数组的新副本您可以使用
System.arraycopy
(请参阅@Abra的答案)或Arrays.copyOfRange
,后者更简单:现在,我们查找
xs
中的最大元素(即valorMaxim(xs)
),并将其与x
进行比较,作为最终结果:将所有内容放在一起,不要忘记添加一个长度检查器:
就是这样!因为我们首先有长度检查器,我们可以安全地确保
xs
永远不会为空,因此valorMaxim(xs)
永远不会得到ArrayIndexOutOfBoundsException
。1.设定数组的边界
你可能已经发现,每次复制一个新的数组可能会消耗大量的时间和内存。与其为
xs
创建一个物理副本,我们可以将这个想法概念化,并使用一个有界数组来代替。我们需要定义一个helper方法来实现这一点:然后我们可以将
valorMaxim
定义为最后,我们没有创建
arr
的任何新副本,而是使用其自身的不同范围,并在整个过程中将它们视为xs
。