我是算法的新手,并想知道这个显示的函数应该如何从递归转换/转换为迭代。在转换时我应该记住什么?
public int binom(int n, int k)
{
if (k == 0 || n == k) { return 1; }
return binom(n - 1, k - 1) + binom(n - 1, k);
}
提前致谢!
答案 0 :(得分:1)
事实上,如果您只是查看递归代码并尝试解密它,这个问题就不那么容易了。 但是,它可能是一个有用的提示,(n over k),即二项式系数可写为
n! / (k! * (n - k)!)
“!”表示阶乘。 并且应该很容易为你计算循环中的阶乘(即迭代)。
如果中间结果太大,您可以在计算之前缩短。你可以缩短任期k!或者术语(n-k)! (你会选择更大的)。例如,当n = 5且k = 3时,您有: (1 * 2 * 3 * 4 * 5)/((1 * 2 * 3)*(1 * 2))=(4 * 5)/(1 * 2)
扰流警报:
public static int binomial(int n, int k) {
int nMinusK = n - k;
if (n < nMinusK) {
//Switch n and nMinusK
int temp = n;
n = nMinusK;
nMinusK = temp;
}
int result = 1;
// n!/k!
for (int i = k + 1; i <= n; i++) {
result *= i;
}
//Division by (n-k)!
for (int j = 1; j <= nMinusK; j++) {
result = result / j;
}
return result;
}
答案 1 :(得分:0)
您可以使用乘法形式的二项式系数,例如来自Wikia,可以使用faculties或循环轻松实现。