这是我的代码。
public static void main(String[] args) {
int[] array = {5,3,1,0,4,7};
int smallest = array[0];
System.out.println(smallest(array,smallest));
}
private static int smallest(int[] array, int smallest){
int count = 0;
if(array[count] < smallest){
smallest = array[count];
}
else if(array[count] == array[array.length-1]){
return smallest;
}
count++;
return smallest(array,smallest);
}
}
我需要使用java来使用RECURSION查找数组中的最小int,我知道如何使用迭代来查找它,但这是严格的递归。任何帮助都会被贬低..这个错误似乎在我这里。
- &GT;返回最小(数组,最小);
答案 0 :(得分:0)
问题是变量的一个版本&#34; count&#34;是在&#34;最小的&#34;的每次通话中创建的。并且将0分配给它,所以在调用&#34;最小的&#34;之前增加它的值并不重要。再次。 在函数内部创建的变量不会在函数调用之间共享。
你遇到的问题是因为&#34;计数&#34;始终为0且递归永远不会结束,因此它以堆栈溢出错误结束。
要解决这个问题,你必须添加另一个参数&#34; count&#34;,它将保存算法的迭代次数。
public static void main(String[] args) {
int[] array = {5,3,1,0,4,7};
int smallest = array[0];
System.out.println(smallest(array,smallest,0));
}
private static int smallest(int[] array, int smallest, int count){
if(array[count] < smallest){
smallest = array[count];
}
else if(array[count] == array[array.length-1]){
return smallest;
}
return smallest(array,smallest,count+1);
}
答案 1 :(得分:0)
除非您的代码进入if
或else if
块,否则它将继续前进并再次调用最小值。由于传递完全相同的参数,因此得到的结果完全相同。 记住count是一个局部变量。
此外,我认为您可能需要if
而不是else if
,因为如果最后一个数字较小,您可能会遇到异常。
答案 2 :(得分:0)
当你有两个数字时,你只需要比较它们就可以找到最小数字。因此,如果将数组拆分为两个,则在每一半中找到最小数组,然后只比较结果以找到最小数。以下是递归的概述(注意:我没有编译或测试它):
int getSmallest(ArrayList<Integer> numbers) {
if (numbers.size() == 1) return numbers.get(0);
int leftMin = getSmallest(numbers.subList(0, numbers.size()/2);
int rightMin = getSmallest(numbers.subList(numbers.size()/2, numbers.size());
return leftMin < rightMin ? leftMin : rightMin;
}
如果你需要使用int [],你仍然可以使用相同的方法,它只需要一些调整:)