将递归程序转为迭代

时间:2017-02-08 13:58:03

标签: java recursion exponent modular-arithmetic

一位朋友要求我编写一个程序,该程序可以获得三个整数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

这是一个非常简单的递归解决方案,依赖于{{1}}这一事实,并以对数时间运行。至少在理论上。

在实践中,当我们测量我们的解决方案时,他的线性时间解决方案比我的解决方案更好。我怀疑这是由于我使用递归而不是循环。那有意义吗?如果是这样 - 我如何将此代码转换为迭代程序?

1 个答案:

答案 0 :(得分: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;
}

免责声明:虽然以上代码对我来说没问题,但我还没有亲自测试过。