在进行幂运算时,往往是通过累计相乘的方法得到结果,但是这种方法效率低。 例如,当我们要计算9的7次方,通过累次相乘的方法如下:
一共需要进行7次乘法。
快速幂提供了一种快速计算的思路:
当我们要计算上述问题时,
我们可以先转化为子问题
而
因此,问题又转化为求解。 同理:。而。
这样我们就用逐级递归的形式得到了的答案,一共进行了4次计算。
① ② ③ ④
我们可以写出递归代码:
public int quickPow(int x,int n){
int ans = 1;
if(n==0){
return 1;
}elseif(n%2==1){
return quickPow(x,n-1)*x;
}else{
int temp = quickPow(x,n/2);
return temp*temp;
}
}
递归的方法是倒序分解问题,直至问题规模不能再分,即找到①后,再逐个递归。 另一种代码格式是正序计算:
public int quickPow(int x,int n){
int ans = 1;
while(n!=0){
//(n&1)!=0说明对应二进制在最右边位为1,说明是奇数
if((n&1)!=0) ans = ans * x;
x = x*x;
//x翻倍后,幂次减半,即右移一位
n>>=1;
}
}