【问题标题】:Find the maximum elements in an array using recursion使用递归查找数组中的最大元素
【发布时间】:2014-09-24 06:16:38
【问题描述】:

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

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并且总是使用尾元素来比较;

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

非常感谢任何帮助!

【问题讨论】:

  • 在这个任务中复制数组是昂贵且不必要的。

标签: arrays algorithm recursion


【解决方案1】:

首先,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)) 两次?只需使用一个变量来提高您的算法速度。

【讨论】:

  • 很高兴能提供帮助:)
猜你喜欢
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2012-12-25
  • 2016-07-05
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多