我是算法初学者。我刚刚找到了一个解决方案,“递归地找到整数数组中的最大元素”:
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.他使用另一个“最大”参数来跟踪到目前为止发现的最大值。我没有在我的代码中使用它,但我没有使用它。这实际上是我被卡住的地方。我没有使用那个“最大”变量来跟踪每次迭代的最大值,为什么我可以达到相同的结果呢?
非常感谢任何帮助!
答案 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))
?只需使用变量来提高算法速度。