java数组递归方法中的最小整数

时间:2018-04-14 10:43:53

标签: java arrays recursion

我需要编写一个递归方法来查看数组并找到最小的索引,但是我有一个奇怪的问题,由于某种原因我的给定测试数组似乎返回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;

}

}

5 个答案:

答案 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; 
}