我觉得我非常接近,但我的返回值会不断打印出数组中的第一个值..
public static double mx(int[] nums, int track)
maxNow = nums[0];
if (count < [lengthofarray] - 1 && nums[track] != 0)
{
if (numbers[track] > maxval)
maxval = numbers[track];
System.out.println(maxval);
return maxval = mx(nums, track+1);
}
else
return maxval;
}
答案 0 :(得分:2)
currentMax
是在findMax
内声明的局部变量。这意味着,如果findMax
调用自身,它再次调用自身,再次调用自身,以便它现在在堆栈上四次,则会有四个不同的currentMax
变量;每个findMax
都有自己的。因此,如果其中一个findMax
调用修改了currentMax
,它只会修改自己的currentMax
;修改对属于findMax
的其他调用的本地currentMax
变量没有影响。
有一些方法可以让方法调用共享相同的numbers[3]
(将其作为参数传递,如另一个答案所示,是可能的),但是你不需要它们。相反,请稍微查看问题:如果要查找numbers[10]
到numbers[4]
的最大值,可以递归调用函数以查找numbers[10]
到{{1}的最大值},然后查看numbers[3]
并将其与您递归发现的最大值进行比较。
P.S。我不建议将currentMax
设为静态字段以便共享它;在我看来,使用全局字段来保存递归结果通常是糟糕的编程习惯。 (一方面,它引入了线程不安全。)如果仔细进行,有很多方法可以做到这一点,但总的来说我认为应该避免这种做法。
答案 1 :(得分:1)
尝试简化代码:
public static int findMax(int[] numbers, int count){
if (count > 0) {
return Math.max(numbers[count], findMax(numbers, count-1))
}
else {
return numbers[0];
}
}
答案 2 :(得分:1)
以下是如何将此问题可视化:
您的数据可能看起来像
{a, b, c, d, e}
您需要使用
找到最大值max(a, max(restOfElements))
表示您需要再次使用
max(a, max(b, max(restOfElements)))
.
.
.
max(a, max(b, max(c, max (d, max(e, nothing)))))
和最后一个案例可以更好地显示为
max(a, . . . . )
max(b, . . . )
max(c, . . )
max (d, . )
max(e, nothing)
所以最后你有两个案例
e
时,您无法将其与任何内容进行比较e
,因为没有别的东西可以与之比较。 以下是您的代码的外观(将鼠标悬停在框上以查看代码,但在执行此操作之前,请尝试再次自行实现)
public static double findMax(double[] numbers, int count) { if (count == numbers.length - 1)//we are handling last element return numbers[count]; //else, we are returning greater number between current element, //and max from rest of elements return Math.max(numbers[count], findMax(numbers, count + 1)); }
用法示例:
double[] arr = { 1, 2, 2, 1, 4, 3 };
System.out.println(findMax(arr, 0));
输出:4.0
作为练习,而不是在max(a, max(b, max(c, max(d, max(e))))
中分割您的问题,尝试创建方法,就像max(max(max(max(max(a), b), c), d), e)
答案 3 :(得分:0)
&& numbers[count] != 0
的目的究竟是什么?如果你的所有数字都是负数怎么办?
其次,尝试将currentmax作为参数传递,而不是在方法内初始化它。您想要跟踪当前的Max。将其初始化为局部变量不会这样做,但会在每次调用时将其重置为第一个元素。
public static double findMax(double[] numbers, int count, double currentMax)
{
if (count < numbers.length)// && numbers[count] != 0) //While the value of count remains lower than the size of the array and the current element of the arraylist doesn't = 0, the execute the code..
{
if (numbers[count] > currentMax)
currentMax = numbers[count];
return currentMax = findMax(numbers, count+1, currentMax);
}
else return currentMax;
}
答案 4 :(得分:0)
好吧,既然我们给出了答案,我就会这样做:
max(arr [1-n])= max(arr [1],max(arr [2-n]);
public static double findMax(final double ...arr){
return findMax(arr, 0);
}
private static double findMax(final double[] arr, final int start){
// base case, if this is the end of the array, the max of the "rest"
// is just this element
if(start == arr.length - 1)
return arr[start];
// else continue
// find the max of the rest of the array
final double nextMax = findMax(arr, start + 1);
// return this index if it's greater than the next max,
// else return the next max
return arr[start] > nextMax ? arr[start] : nextMax;
}
答案 5 :(得分:0)
我的尝试在这里:
public static double findMax(double[] numbers, int count, double currentMax){
if( count < numbers.length ){
if( numbers[count] > currentMax ){
currentMax = numbers[count];
}
currentMax = findMax( numbers, count+1, currentMax );
}
return currentMax;
}