【发布时间】:2018-01-02 16:33:18
【问题描述】:
我还不太了解递归,并且有一些我无法解决的作业。有人有想法吗?
任务 1: 实现一个 int 方法 max(int[]arr, int i),它返回 arr 所有元素的最大值,索引
到目前为止,这是我的代码:
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;
}
这也有效,我明白为什么,但显然该方法没有两个递归调用。每次尝试实现将数组分成两半的方法都是一个巨大的失败。谁能帮帮我?
【问题讨论】:
-
@nafas 不,这些是关于递归的具体问题。递归可能不是解决这个问题的最佳方法,而 OP 尤其需要它来做作业。此处不要求进行一般性审查,但它清楚地表明了研究、努力和少量理解。 OP 只是想要一种特定的、不同的实现方法。我敢说它已经是一个 MCVE,为什么不适合 Stack Overflow?
-
对于第一个,考虑将当前值与递归调用返回的值进行比较。这样你就可以消除静态变量了。
-
@Mast ** 在我看来 **(是的,我们根据自己的意见投票),家庭作业会让学生失败,只有失败才能让我们成为最好的。代码审查会显示你做错了什么,而新的解决方案只会为家庭作业提供更好的答案。在这种情况下,一个人将获得满分,并且永远不会费心去找出原因!!!!
-
@nafas 这就是教育。评论不会改变这一点。
标签: java arrays recursion boolean