N choose r を計算する再帰アルゴリズムを実装しました。C(n,r) = C(n-1,r-1) + C(n-1,r)。stackoverflow をスローしている C(100000, 50000) を計算したかったのです。どんな助けにも感謝します。
エラー:
java Solution 1 1 10000 5000 スレッド「メイン」での例外 java.lang.String の java.lang.System.arraycopy(Native Method) の java.lang.StackOverflowError (Arrays.java:3210) .(String.java:215) で java.lang.StringBuilder.toString(StringBuilder.java:430) で Solution.findNcr(Solution.java:31) で 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
}
}