我还不太了解递归,而且我有一些我无法解决的功课。有没有人有想法?
任务1: 实现一个int方法max(int [] arr,int i),它返回arr的所有元素的最大值,索引为< = i。
到目前为止,这是我的代码:
private static int max = 0;
private static int max(int[] arr, int i) {
if (i >= 0 && i < arr.length) {
if (arr[i] >= max) {
max = arr[i];
}
max(arr, i - 1);
}
return max;
}
实际上它有效,但它的风格很糟糕,所以我的问题是:如何在没有私有静态int max的情况下实现递归方法?我不允许在方法中添加第三个参数。
任务2: 实现一个布尔方法containsValue(int [] arr,int val),如果arr的一个元素与val匹配,则返回true。该方法应该有两个递归调用:一个搜索数组的前半部分,另一个搜索后半部分。您可以使用Arrays.copyOfRange(...)。
这是我的代码:
private static boolean containsValue(int[] arr, int val) {
if (arr.length > 1) {
if (arr[arr.length - 1] == val) {
return true;
}
return containsValue(Arrays.copyOfRange(arr, 0, arr.length-1), val);
}
return false;
}
这也有效,我理解为什么,但显然这个方法没有两个递归调用。每次尝试实现将阵列分成两半的方法都是一个巨大的失败。任何人都可以帮助我吗?
答案 0 :(得分:3)
对于一般的递归,您需要结构:
if the problem is simple enough to answer easily:
return the answer
else:
split the problem into two parts
recurse to get the answer
return the answer
对于max()
,这是:
if the input list is of size 1:
return the only element of the list
else
split the list into a head (first element) and a tail (rest of the list)
recurse to get the max of tail
return the head or the max of tail, whichever is largest
或者在Java中:
int max(int[] list) {
if(list.length == 1) {
return list[0];
} else {
return Math.max(list[0], max(tail(list)));
}
}
(您需要使用int[] tail(int[] list)
)
Arrays.copyOfRange()
此实现不处理零长度输入列表 - 它将是一个无意义的调用,具有未定义的结果。如果你愿意的话,你可以让它抛出更多信息。
你的第二个任务可以用基本相同的方式编写,但现在有两个“简单”的情况我们不会递归:
false
true
所以:
boolean contains(int value, int[] list) {
if(list.length == 0) {
return false;
}
if(list[0] == value) {
return true;
}
return contains(value, tail(list));
}
...除了你被告知要进入前半部分,然后是阵列的后半部分。所以,就像你被告知的那样:
int contains(int value, int[] list) {
if(list.length == 0) {
return false;
}
if(list.length == 1) {
return list[0] == value;
}
return contains(value, firstHalf(list)) ||
contains(value, secondHalf(list));
}
您需要使用firstHalf()
再次编写自己的secondHalf()
和Arrays.copyOfRange()
实施方案。确保当输入列表为奇数长度时,中间值仅为一半。
注意声明这是怎么做的 - 它几乎直接翻译成英文声明:“我知道如果列表为空则不存在。如果它是列表的第一个元素,或者如果它是列表的尾部包含它。“
请注意,在这两种情况下,递归都不是在Java中实现此功能的有效方法。但我相信你的老师正在指导你进行更实际和必要的递归应用。