我實現了遞歸算法來計算N選擇r。 C(n,r)= C(n-1,r-1)+ C(n-1,r)。 我想計算C(100000,50000),這是拋出stackoverflow。感謝任何幫助。用BigInteger計算C(n,r)的StackOverflowError
錯誤:
java Solution 1 1 10000 5000 Exception in thread "main" java.lang.StackOverflowError at java.lang.System.arraycopy(Native Method) at java.util.Arrays.copyOfRange(Arrays.java:3210) at java.lang.String.(String.java:215) at java.lang.StringBuilder.toString(StringBuilder.java:430) at Solution.findNcr(Solution.java:31) at Solution.findNcr(Solution.java:35)
代碼:
private static HashMap<String,BigInteger> hm =
new HashMap<String,BigInteger>(10000000,0.9f);
private static BigInteger findNcr(int n, int r) {
BigInteger topLVal = BigInteger.valueOf(0);
BigInteger topRVal = BigInteger.valueOf(0);
int parentN = 0, parentR = 0;
if(r >= n-r) //ncr = nc(n-r)
r = n-r;
if (r == 0 || r == n)
return BigInteger.valueOf(1L);
else if (r == 1 || r == n-1)
return BigInteger.valueOf(n);
else if (hm.containsKey(""+n+""+r)) { //line 31
return hm.get(""+n+""+r);
} else{
parentN = n-1; parentR = r-1;
topLVal = findNcr(parentN, parentR);
topRVal = findNcr(parentN, r);
hm.put(""+parentN+""+parentR,topLVal);
hm.put(""+parentN+""+r, topRVal);
return topLVal.add(topRVal); //line 35
}
}
每次遞歸算法可以被轉換爲迭代形式,反之亦然,所以你只需要找出如何使用for和while來編寫它 – ignis
是的,我想出了一種方法,但是這需要創建一個尺寸爲N * R的二維數組,我的要求N <= 100000000,所以我會佔用空間大小爲100000000 * 50000000(最壞的情況)。因此,我繼續使用這種自頂向下的方法和一個哈希映射緩存,我應該嘗試迭代方法和se它如何執行。謝謝! – NaveenBabuE