【发布时间】:2016-11-07 16:06:06
【问题描述】:
我是算法新手,想知道这个显示的函数应该如何从递归转换/转换为迭代。转换时应该注意什么?
public int binom(int n, int k)
{
if (k == 0 || n == k) { return 1; }
return binom(n - 1, k - 1) + binom(n - 1, k);
}
提前致谢!
【问题讨论】:
我是算法新手,想知道这个显示的函数应该如何从递归转换/转换为迭代。转换时应该注意什么?
public int binom(int n, int k)
{
if (k == 0 || n == k) { return 1; }
return binom(n - 1, k - 1) + binom(n - 1, k);
}
提前致谢!
【问题讨论】:
其实这个问题没那么简单,只要看看递归代码,试着解密一下。 但是,这可能对您有帮助,即 (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;
}
【讨论】:
您可以使用二项式系数的乘法形式,例如来自Wikia,它可以很容易地用院系或循环来实现。
【讨论】:
BigInteger,它支持堆上的大数。此外,您可以将乘法和除法拆分为多个因数,因此您的数字会更小。