【问题标题】:Recursive function to iterative function as binoms作为二项式的递归函数到迭代函数
【发布时间】: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);
}

提前致谢!

【问题讨论】:

    标签: java loops recursion


    【解决方案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;
    }
    

    【讨论】:

    • 好的,谢谢!你说的缩短是什么意思,具体是怎么做的?
    【解决方案2】:

    您可以使用二项式系数的乘法形式,例如来自Wikia,它可以很容易地用院系或循环来实现。

    【讨论】:

    • 我用院系做过这个,但是对于更大的数字,int 或 long 不支持它,院系太大而不那么可取。
    • 你可以使用BigInteger,它支持堆上的大数。此外,您可以将乘法和除法拆分为多个因数,因此您的数字会更小。
    猜你喜欢
    • 2021-12-31
    • 2016-03-01
    • 2019-06-20
    • 2020-08-08
    • 2015-05-30
    相关资源
    最近更新 更多