pow(x,n)的迭代实现

时间:2014-08-29 15:24:11

标签: pow iteration

我发现了pow(x,n)的迭代实现,它需要o(log n)时间和常量空间,如下所示:

double pow(double x, int n) {
    double left = x;
    double right = 1;

    if (n<0) return 1/(x*pow(x,-n-1)); // Avoid binary overflow!!!!

    if (!n) return 1;

    while (n>1)
    {
        if (n%2==1) right *= left;
        left = left * left;
        n = n/2;
    }

    return left * right;
}

但是我找不到这个算法的任何解释。我理解使用分而治之技术的递归解决方案,我想这个解决方案使用类似的技巧。但我不明白为什么会这样。任何人都可以向我解释这个算法吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

该算法将指数n分解为表示数字的位。

第一行通过计算倒数来处理负指数,并反转n的符号。并不是它通过减去一个

将x ^ 1从pow()函数中拉出来
if (n<0) return 1/(x*pow(x,-n-1));

该算法通过观察x ^ 0 = 1来处理零位(参见此行):

if (!n) return 1;

while循环重复平方x(参见left = x; left = left * left;),因为它将指数n除以2.正确的因子用于计算设置时第i位的值。

while (n>1)
{
    if (n%2==1) right *= left;
    left = left * left;
    n = n/2;
}

当n <= 1时,循环终止,此时第i位的值为== x ^(2 * i),右= = x ^(2 *(i-1))+ ... x ^(2 *(in)),用于'on'的位。