繁体   English   中英

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

[英]Find the maximum elements in an array using 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];
}

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

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

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

任何帮助是极大的赞赏!

首先,nm所说的是正确的,复制阵列既昂贵又不必要。 另一种算法使用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))调用findMax(Arrays.copyOf(arr, arr.length-1)) 只需使用变量来提高算法速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM