我正在学习JAVA,现在我正在学习记忆。但我有点迷失方向......
有没有人有一些关于如何使用递归和使用memoization来加速算法来计算Java中的组合的示例代码?
像计算C5,3 = 5 * 4 * 3/3 * 2 * 1 = 10的方法一样?但是使用递归?
答案 0 :(得分:1)
让我们举一个例子 20选择5
由于20 choose 5
定义为20! / ( 5! * (20-5)! )
我们可以使用memoization
来存储那些因子计算,这样我们就不必在递归下不断地重新计算它们。
所以:
//STORING FACTORIAL COMPUTATIONS
private Map<Integer,Long> factorialMap = new HashMap<Integer,Long>();
public Long getFactorial(int number) {
//CHECK IF I ALREADY COMPUTED THIS FACTORIAL
Long val = factorialMap.get(number);
if(val != null) {
//GOT IT!
return val;
} else {
//NEED TO COMPUTE!
val = getFactorialRecursive(number);
//STORING IT TO SAVE COMPUTATION FOR LATER
factorialMap.put(number, val);
return val;
}
}
//RECURSIVE FUNCTION TO COMPUTE FACTORIAL
public Long getFactorialRecursive(int number) {
if(number < 2) {
return 1L;
} else {
return number * getFactorialRecursive(number-1);
}
}
//ACTUAL CALL TO "20 choose 5"
public Long combination(int fromVal, int chooseVal) {
return getFactorial(fromVal)/(getFactorial(chooseVal)*getFactorial(fromVal-chooseVal));
}
答案 1 :(得分:0)
您可以在此处免费使用combinatoricslib
库: