对于求幂,文中给了递归算法,后面题中让给出非递归算法;
其实实质就是:
——基本情况 n==0,返回1;
——如果幂为偶数,那么可以由pow(x,2)得来;
——如果幂为奇数,那么可以由pow(x,2)*x得来。
递归方法:非常直观,但要注意不要追求那些没用的花哨,刻意的变形还导致了无限循环
//递归求幂
//O(logN)
int pow(int x, int n)
{
if (n == 0)
return 1;
if (n % 2 == 0)
return pow(x*x, n / 2);
else
return pow(x*x, n / 2)*x;
}
非递归方法:
主要 要记录拆分过程的偶数与奇数顺序,比如可以用以用0偶1奇表示,便后面的还原计算;再者注意数组的大小和下标即可。
//非递归求幂
//O(logN)
int myPow(int x, int n)
{
if (n == 0)
return 1;
int i = n;
int result = x;
int j = 0;
int *a = new int[log2(n)];
while (i >= 1) {
if (i % 2 != 0)
a[j] = 1;
else
a[j] = 0;
++j;
i /= 2;
}
for (int k = log2(n) - 1; k >= 0; --k)
{
if (a[k] == 0)
result = result*result;
else
result = result*result*x;
}
return result;
}