【问题标题】:Iterative implementation of pow(x, n)pow(x, n) 的迭代实现
【发布时间】:2014-10-23 15:33:51
【问题描述】:

我发现了一个 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;
}

但是我找不到这个算法的任何解释。我理解使用分而治之技术的递归解决方案,我猜这个解决方案使用了类似的技巧。但我不明白为什么会这样。谁能给我解释一下这个算法? 谢谢!

【问题讨论】:

标签: pow iteration


【解决方案1】:

此算法将指数 n 分解为代表数字的位。

第一行通过计算倒数和反转 n 的符号来处理负指数。并不是说它通过减一将 x^1 从 pow() 函数中拉出来,

if (n<0) return 1/(x*pow(x,-n-1));

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

if (!n) return 1;

while 循环在将指数 n 除以 2 时反复对 x 求平方(参见 left=x; left = left*left;)。当设置时,右侧因子用于计算第 i 位的值。

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

循环在 n

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2013-11-02
    相关资源
    最近更新 更多