【问题标题】:Iterative logarithmic exponentiation迭代对数取幂
【发布时间】:2014-04-03 02:40:35
【问题描述】:
我最近轰炸了一次采访(带有 collabedit 的电话屏幕)。
这是问题:
编写一个迭代 O(lg n) 算法来求 x^y 的幂(x 是一个双精度数,y>0 是一个整数)。
我首先做了递归分而治之,并试图将其转换为迭代......但我做不到:S
是否有将递归转换为迭代的方法(尾递归很容易,但是具有两个可能的递归调用的递归函数呢?这取决于条件来决定将调用哪个调用)?
【问题讨论】:
标签:
c++
recursion
tail-recursion
iteration
exponentiation
【解决方案1】:
展开它的典型方法是使用 b 的按位表示。计算 a1、a2、a4、a8 等,并在每一步确定是否不要将其乘以总数。此处显示:
double result = 1;
double multiplier = a;
for (double multiplier = a; b != 0; multiplier *= multiplier, b /= 2) {
if (b % 2 == 1) {
result *= multiplier;
}
}
例如,要计算 35,我们会注意到 5 的二进制表示为 101,因此我们将 31 和 34 相乘.
希望这会有所帮助!