递归函数查找最大值

时间:2014-04-03 00:08:33

标签: java recursion

我觉得我非常接近,但我的返回值会不断打印出数组中的第一个值..

public static double mx(int[] nums, int track)  
maxNow = nums[0];
if (count < [lengthofarray] - 1 && nums[track] != 0) 
{
    if (numbers[track] > maxval)
    maxval = numbers[track];
    System.out.println(maxval);
    return maxval = mx(nums, track+1);          
}
else
return maxval;
}

6 个答案:

答案 0 :(得分:2)

currentMax是在findMax内声明的局部变量。这意味着,如果findMax调用自身,它再次调用自身,再次调用自身,以便它现在在堆栈上四次,则会有四个不同的currentMax变量;每个findMax都有自己的。因此,如果其中一个findMax调用修改了currentMax,它只会修改自己的currentMax;修改对属于findMax的其他调用的本地currentMax变量没有影响。

有一些方法可以让方法调用共享相同的numbers[3](将其作为参数传递,如另一个答案所示,是可能的),但是你不需要它们。相反,请稍微查看问题:如果要查找numbers[10]numbers[4]的最大值,可以递归调用函数以查找numbers[10]到{{1}的最大值},然后查看numbers[3]并将其与您递归发现的最大值进行比较。

P.S。我不建议将currentMax设为静态字段以便共享它;在我看来,使用全局字段来保存递归结果通常是糟糕的编程习惯。 (一方面,它引入了线程不安全。)如果仔细进行,有很多方法可以做到这一点,但总的来说我认为应该避免这种做法。

答案 1 :(得分:1)

尝试简化代码:

public static int findMax(int[] numbers, int count){
    if (count > 0) {
        return Math.max(numbers[count], findMax(numbers, count-1))
    } 

   else {
        return numbers[0];
   }
}

答案 2 :(得分:1)

以下是如何将此问题可视化:

您的数据可能看起来像

{a, b, c, d, e}

您需要使用

找到最大值
max(a, max(restOfElements))

表示您需要再次使用

max(a, max(b, max(restOfElements)))
.
.
.
max(a, max(b, max(c, max (d, max(e, nothing)))))

和最后一个案例可以更好地显示为

max(a,  .      .      .       .                )
       max(b,  .      .       .               )
              max(c,  .       .              )
                     max (d,  .             )
                             max(e, nothing)

所以最后你有两个案例

  1. 当您处理e时,您无法将其与任何内容进行比较
  2. 当您将当前值与其后的最大值进行比较时
    • 要处理第一种情况,您只需要返回e,因为没有别的东西可以与之比较。
    • 要处理第二种情况,只需从其余元素中获取最大值,将其与当前值进行比较并返回更大值。

    以下是您的代码的外观(将鼠标悬停在框上以查看代码,但在执行此操作之前,请尝试再次自行实现)

      

    public static double findMax(double[] numbers, int count) { if (count == numbers.length - 1)//we are handling last element return numbers[count]; //else, we are returning greater number between current element, //and max from rest of elements return Math.max(numbers[count], findMax(numbers, count + 1)); }

    用法示例:

    double[] arr = { 1, 2, 2, 1, 4, 3 };
    System.out.println(findMax(arr, 0));
    

    输出:4.0


    作为练习,而不是在max(a, max(b, max(c, max(d, max(e))))中分割您的问题,尝试创建方法,就像max(max(max(max(max(a), b), c), d), e)

    一样

答案 3 :(得分:0)

&& numbers[count] != 0的目的究竟是什么?如果你的所有数字都是负数怎么办?

其次,尝试将currentmax作为参数传递,而不是在方法内初始化它。您想要跟踪当前的Max。将其初始化为局部变量不会这样做,但会在每次调用时将其重置为第一个元素。

public static double findMax(double[] numbers, int count, double currentMax)  
{
if (count < numbers.length)// && numbers[count] != 0) //While the value of count remains lower than the size of the array and the current element of the arraylist doesn't = 0, the execute the code..
{
    if (numbers[count] > currentMax)
        currentMax = numbers[count];
    return currentMax = findMax(numbers, count+1, currentMax);          
}
else return currentMax;
}

答案 4 :(得分:0)

好吧,既然我们给出了答案,我就会这样做:

max(arr [1-n])= max(arr [1],max(arr [2-n]);

public static double findMax(final double ...arr){
    return findMax(arr, 0);
}

private static double findMax(final double[] arr, final int start){
    // base case, if this is the end of the array, the max of the "rest" 
    //  is just this element
    if(start == arr.length - 1)
        return arr[start];
    // else continue

    // find the max of the rest of the array
    final double nextMax = findMax(arr, start + 1);
    // return this index if it's greater than the next max, 
    //  else return the next max
    return arr[start] > nextMax ? arr[start] : nextMax;
}

答案 5 :(得分:0)

我的尝试在这里:

 public static double findMax(double[] numbers, int count, double currentMax){

        if( count < numbers.length ){
            if( numbers[count] > currentMax ){
                currentMax = numbers[count];                    
            }

            currentMax = findMax( numbers, count+1, currentMax );
        }
        return currentMax;
    }