如何在java中使用递归解决这个问题?
规则是我必须返回最大的数字,所以用户很想找到最大的数字。将数组一分为二或靠近它,从下半部分的数组中找出最大值,在上半部分找到最大值。我刚开始学习递归,这个问题让我做噩梦如何在java中使用递归解决这个问题?,java,recursion,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
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;
}
您的代码已经非常接近了,但是由于getbist总是调用getbist(),所以它永远不会停止 在递归调用之前,执行如下操作
if (low >= high)
{
return a[low];
}
这仍然留下了一个小问题:当high==low+1时,mid==low,因此getmaxist(a,mid,high)
的大小将与您正在进行的调用相同。再次使用相同的参数进行递归意味着它永远不会停止
您的递归调用应该如下所示:
one = getBiggest(a,low,mid);
two = getBiggest(a,mid+1,high);
这样,两个递归调用都保证更小
最后,末尾的条件部分可以工作,但是返回一个[mid]
永远不会发生。你应该像这样重写它:
if(one >= two)
return one;
else
return two;
在英语中,算法的工作原理如下:
一个问题的递归解决方案是由同一问题的较小版本的解决方案组成的。任何递归算法都必须有一个基本情况——如果问题足够小,可以简单地解决,那么就必须这样做。函数不能总是递归地调用自己,否则就保证得到无限递归,这在Java中意味着
StackOverflowException
。在这种情况下,只要参数有效,您总是调用getmaxist
,这就是您的问题所在。您编写了“如果从低到高的部分是3或更大”,但代码中没有这样的If语句。添加一个将允许您在低和高满足时避免递归。您的实现存在两个问题:
- 它没有正确地执行参数检查-检查需要在顶部进行,并且
- 你错过了基本情况。任何递归程序都必须指定当您只需要一个或两个项目时要做什么;你的程序没有这样做
您需要在顶部添加一个条件,以查看high减去low是2还是更少。如果是1,返回低端的数字;如果有两个数字,请选择最大值并返回。因此,您正在查找数组中位于数组[low]和数组[high]之间的最大数字?是的,您在低部分找到一个,在高部分找到一个,并返回这两个数字中的最大一个。在一个部分中找到最大的数字,并且使用递归。我可以问一下为什么吗?很明显,如果我只是循环,这会很容易,但我必须使用递归来解决这个特定的问题,这正是我正在努力解决的问题。教授们应该教递归使用简单的问题,它实际上是有用的——比如河内塔、合并排序、树遍历、dyck语言等等。有太多的问题像“我如何使用递归来解决这个我应该迭代解决的问题”?哦,谢谢!你知道我如何在这些部分中找到最大的数字吗?我不知道如何使用递归进行循环。@James你已经在这样做了。
one=getmaxist(a,low,mid)
,等等,行正在运行。@詹姆斯,已经完成了。我写了一些文字来解释这并不意味着StackOverflowException
。它通常会导致StackOverflowException
。