下面是一个递归函数来计算二项式Cofecient'C'的值,即组合!我希望用N和K来理解这段代码的时间和空间复杂度(假设我们正在计算NCK)。
public class ValueOfBinomialCofecientC {
static int globalhitsToThisMethod = 0;
public static void main(String[] args) {
// Calculate nCk.
int n = 61, k = 55;
long beginTime = System.nanoTime();
int ans = calculateCombinationVal(n, k);
long endTime = System.nanoTime() - beginTime;
System.out.println("Hits Made are : " +globalhitsToThisMethod + " -- Result Is : " + ans + " ANd Time taken is:" + (endTime-beginTime));
}
private static int calculateCombinationVal(int n, int k) {
globalhitsToThisMethod++;
if(k == 0 || k == n){
return 1;
} else if(k == 1){
return n;
} else {
int res = calculateCombinationVal(n-1, k-1) + calculateCombinationVal(n-1, k);
return res;
}
}
}
答案 0 :(得分:0)
非常有趣的是,运行时是nCk
。递归地表示为:
f(n,k) = f(n-1,k-1) + f(n-1,k)
使用组合公式nCk = n!/(k! * (n-k)!)
表示每一项。如果我尝试写下每一个步骤,这将使答案肿,但是一旦您将表达式代入,就将整个方程式乘以(n-k)! * k!/(n-1)!
。一切都应该取消,以给您n = k + n - k
。
可能有更通用的方法来求解多变量递归方程,但是如果您写出直到n=5
和k=5
的前几个值,这种方法就非常明显。