我決定遞歸地實現一個非常簡單的程序,以查看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