我需要编写一个递归方法来查看数组并找到最小的索引,但是我有一个奇怪的问题,由于某种原因我的给定测试数组似乎返回10的结果。我试过在eclipse中调试并且发生了一些非常奇怪的事情,我的findMinAux方法确实发现-10是最小的值,当我按下“step into”按钮时,它看起来好像即将返回-10但是然后它进入一些奇怪的循环并且startIndex由于某种原因开始增加。如果有人对我出错的地方有任何建议,我将不胜感激,谢谢。
这是我的代码:
public class Q1 {
public static void main(String[] args) {
int[] testArr = {12,32,45,435,-1,345,0,564,-10,234,25};
findMin(testArr);
}
public static int findMin(int[] arr) {
int result = findMinAux(arr,arr.length-1,arr.length-1);
System.out.println(result);
return result;
}
public static int findMinAux(int[] arr, int startIndex, int smallest) {
if(arr[startIndex]<smallest) {
smallest = arr[startIndex];
}
startIndex--;
if(startIndex>=0) {
findMinAux(arr,startIndex,smallest);
}
return smallest;
}
}
答案 0 :(得分:1)
两个问题:
首先,如果要从数组末尾搜索,则应使用最后一个元素启动smallest
:
int result = findMinAux(arr,arr.length-1,arr[arr.length - 1]);
其次,您应该重新分配smallest
:
if(startIndex>=0) {
smallest = findMinAux(arr,startIndex,smallest);
}
答案 1 :(得分:1)
class Minimum {
int minelem;
int minindex;
Minimum() {
minelem = Integer.MAX_VALUE;
minindex = -1;
}
}
public class Q1 {
public static void main(String[] args) {
int[] testArr = {12,32,45,435,-1,345,0,564,-10,234,25};
findMin(testArr);
}
public static int findMin(int[] arr) {
Minimum m = new Minimum();
m = findMinAux(arr,arr.length-1,m);
System.out.println(m.minindex);
return m.minindex;
}
public static Minimum findMinAux(int[] arr, int lastindex, Minimum m) {
if(lastindex < 0) {
return m;
}
if(m.minelem > arr[lastindex]) {
m.minelem = arr[lastindex];
m.minindex = lastindex;
}
return findMinAux(arr,lastindex - 1, m);
}
}
我在这里使用了另一个类来进行简化。请检查这是否解决了您的问题,同时我正在解释原因以及它是如何工作的。
答案 2 :(得分:0)
实际上,这个实现工作正常
0.6.1
AttributeError: module 'flickr_api' has no attribute 'FlickrAPI'
而且你在调用这个函数时也有一个拼写错误,最后一个参数必须是数组中的值,在你的情况下是最后一个值,而不是最后一个索引。
public static int findMinAux(int[] arr, int startIndex, int smallest) {
if(startIndex < 0)
return smallest;
if(arr[startIndex] < smallest){
smallest = arr[startIndex];
}
return findMinAux(arr, startIndex - 1, smallest);
}
更改为
int result = findMinAux(arr,arr.length-1, arr.length - 1);
答案 3 :(得分:0)
此方法适用于单个方法和重载版本,因此您不必传递初始值
public static int findMin(int[] arr) {
int index = 0;
int min = Integer.MAX_VALUE;
min = Math.min(arr[index], min);
return findMin(arr,index+1,min);
}
private static int findMin(int[] arr, int index, int min) {
if(index < arr.length)
{
min = Math.min(arr[index], min);
return findMin(arr,index+1,min);
}
System.out.println(min);
return min;
}
第二种方法是私有的,所以从类外部,只能调用第一个/默认方法。
答案 4 :(得分:-2)
请参阅此代码。在每次迭代中,在比较的基础上将元素与当前元素和指数进行比较。这也是尾递归。所以它也可以用在大型数组中。
while( length($someString) < 10 ) {
# prepend "0" to $someString (increases length of $someString by 1)
$someString = '0' . $someString;
}