我正在做这项作业,但在递归编写此方法时遇到问题。 我有这种方法,它有效但不是递归的:
public static <T extends Comparable< ? super T>> T getLargest(T [] a, int low,
int high)
{
if(low>high)
throw new IllegalArgumentException();
return Collections.max(Arrays.asList(Arrays.copyOfRange(a, low, high)));
所以从那里我转到了这个,它是它的扩展,但也不是递归的:
T[] arrCopy = (T[]) new Object[high-low];
for(int i=low;i<high;i++){
if(a[i].compareTo(a[i-1])>0)
arrCopy[i]=a[i];
else
arrCopy[i]=a[i+1];
}
return arrCopy[0];
我已经研究了几个小时,但似乎没有办法让它递归并使其工作。 非常感谢任何帮助和想法!
最佳答案
嗯,这是一个将 for 循环转变为尾递归方法的模板:
//iterative version
public Object getIteratively(Object[] a) {
Object retVal = null;
for (int i = 0; i < a.length; a++ ) {
//do something
}
return retVal;
}
//recursive version
public Object getRecursively(Object[] a) {
doGetRecursively(a, 0, null);
}
private Object doGetRecursively(Object[] a, int i, Object retVal) {
if ( i == a.length ) {
return retVal;
}
//do something
return doGetRecursively(a, i+1, retVal);
}
我无法理解为什么你会想用非函数式语言来做到这一点。
在这种情况下,//do some
在两种情况下都是相同的,例如:
if ( a[i].compareTo(retVal) > 0 ) {
retVal = a[i];
}
关于java - 将getLargest重写为Java中的递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7798618/