如何在java中使用递归来解决这个问题?

时间:2016-03-20 23:14:13

标签: java recursion

规则是我必须返回最大的数字,所以用户想要找到最大的数字。将数组拆分为一半或靠近它,并从下半部分中的数组中找到最大值,并在高半部分找到最大值。我刚刚开始学习递归,这个问题给了我噩梦。

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;
}

3 个答案:

答案 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. 如果只有一个元素,请将其返回。否则;
  2. 获取上半部分中的最大元素(第一个递归调用),然后
  3. 获取下半部分中的最大元素(第二次递归调用),然后
  4. 返回哪个更大。
  5. 问题的递归解决方案是针对相同问题的较小版本的解决方案。

答案 1 :(得分:0)

任何递归算法都必须始终具有基本情况 - 如果问题足够小以至于可以简单地解决,那么必须完成。该函数不能总是以递归方式调用自身,否则您将获得无限递归,在Java中这意味着StackOverflowException。在这种情况下,只要参数有效,就总是调用getBiggest,这就是你的问题。你写了“如果从低到高的部分是3或更大”但你的代码中没有这样的if语句。添加一个将允许您在低和高满足时避免递归。

答案 2 :(得分:0)

您的实施有两个问题:

  • 没有正确检查参数 - 检查需要在顶部进行,
  • 您错过了基本情况。任何递归程序必须指定当你只有一两件事时要做什么;你的程序没有这样做。

您需要在顶部添加条件,以查看高负值是否为2或更低。如果是1,则返回低端的数字;如果有两个数字,请选择最大值并将其返回。