【问题标题】:Turn recursive program to iterative将递归程序转为迭代
【发布时间】:2017-02-08 13:58:03
【问题描述】:

一个朋友挑战我写一个程序,得到三个整数(int a, int n, int k)并尽可能高效地计算,a^n mod k

我想出了这个解决方案

public static int rec(int a,int n,int k) //calc a^n mod k
    {
        if(n == 1)
            return a % k; 
        int exp1 = rec(a, n/2, k), exp2 = exp1;
        if(n % 2 == 1)
            exp2 = rec(a, n/2 + 1, k);

        return (exp1 * exp2) % k;
    }

这是一个非常简单的递归解决方案,依赖于 a^(b+c) mod d = (a^b mod d * a^c mod d) mod d 这一事实,并且以对数时间运行。至少理论上是这样。

实际上,当我们测量我们的解决方案时,他的线性时间解决方案比我的解决方案要好。我怀疑这是因为我使用递归而不是循环。那有意义吗?如果是这样 - 我怎样才能把这段代码变成一个迭代程序?

【问题讨论】:

  • Java 递归。 Java 中没有尾递归优化。如果您想要性能,请避免像瘟疫一样。

标签: java recursion exponent modular-arithmetic


【解决方案1】:

这有意义吗?

是的。正如 Boris The Spider 所指出的,Java 中没有尾部优化。

我怎样才能把这段代码变成一个迭代程序?

让我复制粘贴一个迭代解决方案来计算来自here 的数字的幂

int pow(int x, int n) {
int res = 1;
while(n > 0) {
    if(n % 2 == 1) {
        res = res * x;
    }
    x = x * x;
    n = n / 2;
}
return res;
}

免责声明:虽然上面的代码对我来说看起来不错,但我没有亲自测试过。

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 2016-01-26
    • 2017-03-05
    • 2013-08-03
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多