(1)递归方法
根据幂运算的性质,可以得出:

计算a的n次方,如果n是偶数(不为0),那么就先计算a的n/2次方,然后平方;如果n是奇数,那么就先计算a的n-1次方,再乘上a;递归出口是a的0次方为1。
根据以上原理可以得出递归的方法。递归方法时间复杂度为logn,递归不可避免的带来空间消耗
int myPow(int a, int n){
if(n == 0){
return 1;
}else if(n % 2 == 1){
return myPow(a, n-1) * a;
}else{
int temp = myPow(a, n / 2);
return temp * temp;
}
}
(2) 非递归方法
我们换一个角度来引入非递归的快速幂。还是7的10次方,但这次,我们把10写成二进制的形式,也就是(1010)2。
现在我们要计算7^(1010)2,可以怎么做?我们很自然地想到可以把它拆分为 [公式] . 实际上,对于任意的整数,我们都可以把它拆成若干个7^(100…)
的形式相乘。而这些7 ^ (100…),恰好就是 7^1 、 7^2 、 7^4 ……我们只需不断把底数平方就可以算出它们。
int myPow(int a, int n){
int ans = 1;
while(n != 0){
if(a & 1 != 0){
ans *= a;
}
a *= a;
n >>= 1;
}
return ans;
}
本文探讨了计算幂的两种方法:递归实现,利用性质将n次方分解为连续的一半次方相乘;非递归的快速幂,通过二进制展开将幂运算转化为乘法链。介绍了相应的代码实现,并强调了各自的优缺点和时间复杂度。

20万+

被折叠的 条评论
为什么被折叠?



