我正在执行此作业,并且无法递归编写此方法。
我有这种方法可以有效但不递归:

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

10-06 15:07