我发现了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;
}
但是我找不到这个算法的任何解释。我理解使用分而治之技术的递归解决方案,我想这个解决方案使用类似的技巧。但我不明白为什么会这样。任何人都可以向我解释这个算法吗? 谢谢!
答案 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'的位。