我正在执行此作业,并且无法递归编写此方法。
我有这种方法可以有效但不递归:
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 something
在两种情况下都相同,例如:if ( a[i].compareTo(retVal) > 0 ) {
retVal = a[i];
}