通过递归查找数组中最大的正int

Rob*_*ant 6 java puzzle recursion

我决定递归地实现一个非常简单的程序,看看Java如何处理递归*,并且有点短.这就是我最后写的:

public class largestInIntArray {
  public static void main(String[] args)
  {
    // These three lines just set up an array of ints:
    int[] ints = new int[100];
    java.util.Random r = new java.util.Random();
    for(int i = 0; i < 100; i++) ints[i] = r.nextInt();

    System.out.print("Normal:"+normal(ints,-1)+" Recursive:"+recursive(ints,-1));
  }

  private static int normal(int[] input, int largest) {
    for(int i : input)
      if(i > largest) largest = i;

    return largest;
  }

  private static int recursive(int[] ints, int largest) {
    if(ints.length == 1)
      return ints[0] > largest ? ints[0] : largest;

    int[] newints = new int[ints.length - 1];
    System.arraycopy(ints, 1, newints, 0, ints.length - 1); 

    return recursive(newints, ints[0] > largest ? ints[0] : largest);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做很好,但因为它有点难看,我想知道是否有更好的方法.如果有人有任何想法/替代/语法糖分享,那将非常感激!

Ps如果你说"使用Lisp"你什么都不赢(但尊重).我想知道这是否可以在Java中看起来很好看.

*以及如何处理递归

Gre*_*ill 10

这是我如何使递归方法看起来更好:

  private static int recursive(int[] ints, int largest, int start) {
    if (start == ints.length) {
      return largest;
    }
    return recursive(ints, Math.max(ints[start], largest), start + 1);
  }
Run Code Online (Sandbox Code Playgroud)

这避免了昂贵的阵列复制,并适用于空输入数组.您可以实现一个额外的重载方法,只有两个参数用于与迭代函数相同的签名:

  private static int recursive(int[] ints, int largest) {
    return recursive(ints, largest, 0);
  }
Run Code Online (Sandbox Code Playgroud)


Jer*_*ome 7

2项改进:

  • 没有数组的副本(只使用偏移量)
  • 无需提供当前最大值

    private static int recursive(int[] ints, int offset) {
        if (ints.length - 1 == offset) {
            return ints[offset];
        } else {
            return Math.max(ints[offset], recursive(ints, offset + 1));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

用...开始递归recursive(ints, 0).