我决定递归地实现一个非常简单的程序,以查看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);
}
}
而且工作正常,但因为它有点难看,我想知道是否有更好的方法。如果任何人有任何想法/替代品/语法糖分享,这将非常感激!
P.s.如果你说“使用Lisp”,你就赢不了什么(但是尊重)。我想知道这是否可以在Java中看起来不错。
*以及效果如何我手柄递归
递归是不是要在Java作为迭代除了极少数情况下简单或有效的。 – 2009-12-31 13:06:04
是的,但是如果任何人都将为递归的空间复杂性做好充分的准备,那么这是一个Java开发人员:) – 2009-12-31 13:35:39
在任何语言中,您总是必须复制数组或将索引传递到该数组。如果你的意思是“Lisp使用链表”,那么当然,它比“使用数组的Java”更好,但我认为“使用链表的X”比任何X和Y的“Y使用数组”更好。 Common Lisp中的位移数组为您处理一些簿记,但我认为他们确实不会让这种情况变得更简单。) – Ken 2010-01-01 03:49:29