在 Java 中的整数 ArrayList 中查找最小值的递归函数
Recursive function that finds the minimum value in an ArrayList of Integers in Java
这是我在自学过程中一直思考的问题java。问题包括 编写一个递归函数,在整数数组列表中找到最小值 。下面你会发现我的尝试。我相信它正在按预期工作,但我想知道是否有更好的方法来完成这项工作。任何意见表示赞赏。
public static int findMin(ArrayList<Integer> numbers){
// Base Case
if(numbers.size()==1){
return numbers.get(0).intValue();
}
ArrayList<Integer> numbers_short = new ArrayList<Integer>(numbers);
numbers.remove(numbers.size()-1);
return Math.min(numbers_short.get(numbers_short.size()-1).intValue(), findMin(numbers));
}
你的例子不太好,在这种情况下你不应该使用递归。
但是无论如何,您可以避免每次都复制数组,方法是使用带有开始和结束参数的方法来仅分析初始数组的一部分。
类似的东西:
public static int findMin(ArrayList<Integer> numbers) {
return findMin(numbers, 0, numbers.size() - 1);
}
public static int findMin(ArrayList<Integer> numbers, int start, int end) {
if (end == start)
return numbers.get(start);
int middle = start + (end - start) / 2;
return Math.min(findMin(numbers, start, middle), findMin(numbers, middle + 1, end));
}
并在需要时添加检查以防数组为空。
我使用“中间”方法的原因是每次它都将数组除以 2,这意味着最后它限制了堆栈溢出的风险,因为它会将最大递归数除以 2比较每个元素的递归。
您可能希望避免在每次调用该方法时都创建一个新的 ArrayList 对象。对于较小的输入,这似乎无关紧要,但对于非常大的输入,它可能会导致 WhosebugError
.
具有相似时间复杂度的更简洁的解决方案可以是:
public static int findMin(ArrayList<Integer> numbers) {
return findMin(numbers, numbers.size());
}
public static int findMin(ArrayList<Integer> numbers, int len) {
// Base Case
if (len == 1) {
return numbers.get(0);
}
return Math.min(numbers.get(len-1), findMin(numbers, len-1));
}
参考垃圾收集器和递归:
保留原始方法签名和形参 - 代码可以简化,无需每次都创建一个新的临时数组。
public static int findMin(ArrayList<Integer> numbers){
if (numbers.size() == 1) return numbers.get(0);
return Math.min(numbers.remove(0), findMinimum(numbers));
}
numbers.remove(0) 将同时删除第一个元素和 return 删除元素的值,无需创建临时数组。
这是我在自学过程中一直思考的问题java。问题包括 编写一个递归函数,在整数数组列表中找到最小值 。下面你会发现我的尝试。我相信它正在按预期工作,但我想知道是否有更好的方法来完成这项工作。任何意见表示赞赏。
public static int findMin(ArrayList<Integer> numbers){
// Base Case
if(numbers.size()==1){
return numbers.get(0).intValue();
}
ArrayList<Integer> numbers_short = new ArrayList<Integer>(numbers);
numbers.remove(numbers.size()-1);
return Math.min(numbers_short.get(numbers_short.size()-1).intValue(), findMin(numbers));
}
你的例子不太好,在这种情况下你不应该使用递归。 但是无论如何,您可以避免每次都复制数组,方法是使用带有开始和结束参数的方法来仅分析初始数组的一部分。
类似的东西:
public static int findMin(ArrayList<Integer> numbers) {
return findMin(numbers, 0, numbers.size() - 1);
}
public static int findMin(ArrayList<Integer> numbers, int start, int end) {
if (end == start)
return numbers.get(start);
int middle = start + (end - start) / 2;
return Math.min(findMin(numbers, start, middle), findMin(numbers, middle + 1, end));
}
并在需要时添加检查以防数组为空。
我使用“中间”方法的原因是每次它都将数组除以 2,这意味着最后它限制了堆栈溢出的风险,因为它会将最大递归数除以 2比较每个元素的递归。
您可能希望避免在每次调用该方法时都创建一个新的 ArrayList 对象。对于较小的输入,这似乎无关紧要,但对于非常大的输入,它可能会导致 WhosebugError
.
具有相似时间复杂度的更简洁的解决方案可以是:
public static int findMin(ArrayList<Integer> numbers) {
return findMin(numbers, numbers.size());
}
public static int findMin(ArrayList<Integer> numbers, int len) {
// Base Case
if (len == 1) {
return numbers.get(0);
}
return Math.min(numbers.get(len-1), findMin(numbers, len-1));
}
参考垃圾收集器和递归:
保留原始方法签名和形参 - 代码可以简化,无需每次都创建一个新的临时数组。
public static int findMin(ArrayList<Integer> numbers){
if (numbers.size() == 1) return numbers.get(0);
return Math.min(numbers.remove(0), findMinimum(numbers));
}
numbers.remove(0) 将同时删除第一个元素和 return 删除元素的值,无需创建临时数组。