【发布时间】:2010-12-31 09:09:11
【问题描述】:
我决定递归实现一个非常简单的程序,看看 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);
}
}
这很好用,但由于它有点难看,我想知道是否有更好的方法。如果有人有任何想法/替代方案/语法糖要分享,将不胜感激!
附:如果您说“使用 Lisp”,您将一无所获(但尊重)。我想知道这是否可以在 Java 中看起来不错。
*以及我如何处理递归
【问题讨论】:
-
递归在 Java 中不会像迭代那样简单或高效,除非是极少数情况。
-
是的,但如果有人要为递归的空间复杂性做好充分准备,那就是 Java 开发人员 :)
-
在任何语言中,您总是必须复制数组或将索引传递到该数组。如果您的意思是“使用链表的 Lisp”,那么肯定比“使用数组的 Java”更好,但我认为对于任何 X 和 Y,“使用链表的 X”都比“使用数组的 Y”更好。( Common Lisp 中的置换数组会为您处理一些簿记工作,但我认为它们并没有真正让这种情况变得更简单。)