规则是我必须返回最大的数字,所以用户想要找到最大的数字。将数组拆分为一半或靠近它,并从下半部分中的数组中找到最大值,并在高半部分找到最大值。我刚刚开始学习递归,这个问题给了我噩梦。
public static double getBiggest(double[] a, int low, int high)
{
int mid = (low+high)/2;
double one = 0;
double two = 0;
if(a == null || a.length == 0 || low > high)
throw new IllegalArgumentException();
//How do I loop to find the biggest?
//A way to narrow down a big number of array values into a single one
one = getBiggest(a,low,mid);
two = getBiggest(a,mid,high);
if(one >= two)
return one;
else
return two;
return -1;
}
答案 0 :(得分:0)
您的代码已经非常接近,但由于getBiggest 总是调用getBiggest(),因此它永远不会停止。
在递归调用之前,执行类似这样的操作
if (low >= high)
{
return a[low];
}
这仍然留下一个小问题:当高==低+ 1,中= =低时,所以getBiggest(a,mid,high)
将与您所在的调用大小相同。再次使用相同的参数再次表示它永远不会停止。
您的递归调用应该是:
one = getBiggest(a,low,mid);
two = getBiggest(a,mid+1,high);
这样两个递归调用都可以保证更小。
最后,最后的条件部分有效,但return a[mid]
永远不会发生。你应该重写它:
if(one >= two)
return one;
else
return two;
在英语中,算法的工作原理如下:
问题的递归解决方案是针对相同问题的较小版本的解决方案。
答案 1 :(得分:0)
任何递归算法都必须始终具有基本情况 - 如果问题足够小以至于可以简单地解决,那么必须完成。该函数不能总是以递归方式调用自身,否则您将获得无限递归,在Java中这意味着StackOverflowException
。在这种情况下,只要参数有效,就总是调用getBiggest
,这就是你的问题。你写了“如果从低到高的部分是3或更大”但你的代码中没有这样的if语句。添加一个将允许您在低和高满足时避免递归。
答案 2 :(得分:0)
您的实施有两个问题:
您需要在顶部添加条件,以查看高负值是否为2或更低。如果是1,则返回低端的数字;如果有两个数字,请选择最大值并将其返回。