我最近轰炸了一次采访(带有collabedit的电话屏幕)。 这是一个问题: 写一个迭代O(lg n)算法来找到x ^ y的幂(x是双精度,y> 0是一个整数)。
我首先做了递归划分并征服了一个并尝试将其转换为迭代......我不能:S 有没有一种方法可以将递归转换为迭代(尾递归很容易,但是两个可能的递归调用的递归函数如何依赖于条件来决定调用哪个调用)?
答案 0 :(得分:6)
展开它的典型方法是使用b的按位表示。计算 1 , 2 , 4 , 8 等,并在每一步确定是否或不要把它乘以总数。这显示在这里:
double result = 1;
double multiplier = a;
for (double multiplier = a; b != 0; multiplier *= multiplier, b /= 2) {
if (b % 2 == 1) {
result *= multiplier;
}
}
例如,要计算3 5 ,我们注意到5有二进制表示101,所以我们将乘以3 1 和3 4
希望这有帮助!