迭代函数的递归函数作为二进制文件

时间:2016-11-07 16:06:06

标签: java loops recursion

我是算法的新手,并想知道这个显示的函数应该如何从递归转换/转换为迭代。在转换时我应该记住什么?

public int binom(int n, int k)
{
    if (k == 0 || n == k) { return 1; }

    return binom(n - 1, k - 1) + binom(n - 1, k);
}

提前致谢!

2 个答案:

答案 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或循环轻松实现。

Binomial coefficient multiplicative formula