使用递归查找数组中的最大元素

时间:2014-09-24 06:16:39

标签: arrays algorithm recursion

我是算法初学者。我刚刚找到了一个解决方案,“递归地找到整数数组中的最大元素”:

public static int findMax(int[]arr)
{

  if(arr.length==1)
    return arr[0];

  return findMax(Arrays.copyOf(arr, arr.length-1))> arr[arr.length-1]?findMax(Arrays.copyOf(arr, arr.length-1)):arr[arr.length-1];
}

我做了几次测试,似乎工作正常。

但是,我发现有人使用其他递归方法解决了它,就像在这篇文章中一样:

finding max value in an array using recursion java

他的代码就像:

 int largest(int[] a, int start, int largest) 
 {
   if (start == a.length)
     return largest;
   else {
    int l = (a[start] > largest ? a[start] : largest);
    return largest(a, start + 1, l);
}

我对这个特殊问题的思维风格差异的本质感到困惑。我的想法就像:

1.他使用了另一个参数“start”来跟踪每次递归中数组元素的当前光标,我没有使用它,因为我在每次递归时将数组缩小1并始终使用tail元素比较;

2.他使用另一个“最大”参数来跟踪到目前为止发现的最大值。我没有在我的代码中使用它,但我没有使用它。这实际上是我被卡住的地方。我没有使用那个“最大”变量来跟踪每次迭代的最大值,为什么我可以达到相同的结果呢?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

首先,n.m所说的是正确的,复制阵列既昂贵又不必要。另一种算法使用start来避免这种情况。

但是对于你的问题。你实际上使用最大的只是没有命名它任何东西!

return findMax(Arrays.copyOf(arr, arr.length-1))> arr[arr.length-1]?findMax(Arrays.copyOf(arr, arr.length-1)):arr[arr.length-1];

是您发现最大的地方。它就像你提到的另一种算法。首先,你找到最大的:findMax(Arrays.copyOf(arr, arr.length-1))然后你将它的值与:arr[arr.length-1]进行比较,选择你当前最大的任何一个。

另一个建议,为什么你需要两次致电findMax(Arrays.copyOf(arr, arr.length-1))?只需使用变量来提高算法速度。

相关问题