题解思路
a^n = (a^(n/2))*2 = (a^((n/2*2)*2))*2 = ......
代码
这里以2^4为例
public class Test {
public static void main(String[] args){
System.out.println(pow(2,4));
}
public static double pow(double a,int n){
if(n==0){
return 1;
}
double b = pow(a,n/2);
b=b*b;
if(n%2==1){
b=b*a;
}
return b;
}
}
运行结果
代码解读
首先看主要代码
//除了void类型外,其余类型都有返回值,这里是double类型
public static double pow(double a,int n){
if(n==0){
return 1;
}
double b = pow(a,n/2);
b=b*b;
if(n%2==1){
b=b*a;
}
return b;
}
我们以2^4为例,a=2,n=4。看代码的运行过程是怎么样的,为了方便区分不同子问题的b,我给他们编了号。
第一步:判断n==0,若n==0,则a^0=1,返回1,显然这里n=4,所以不执行该处代码
第二步:定义一个double类型变量b,并递归调用pow函数,此时里面的n=n/2,并将pow的值赋给b。double b = pow(2,2)
pow(2,4){
if(4==0){
return 1;
}
double b = pow(2,2);
b = b*b
if(4%2==1){
b = b*a;
}
return b;
}
第三步:由于第二步进入到了pow(2,2),故应该将这个递归函数全部执行完,才能执行下一步
第四步:pow(2,2)的执行过程,n=2,过程和前面三步一样,此时进入到double b1 = pow(2,1)
pow(2,2){
if(2==0){
return 1;
}
double b1 = pow(2,1);
b1 = b1*b1
if(2%2==1){
b1 = b1*a;
}
return b1;
}
第五步:执行pow(2,1),根据前面的步骤,此时进入到double b2 = pow(2,1/2),“/”表示取整,故1/2=0,即double b2 = pow(2,0)
pow(2,1){
if(1==0){
return 1;
}
double b2 = pow(2,0); //执行该部分
b2 = b2*b2
if(1%2==1){
b2 = b2*a;
}
return b2;
}
第六步:执行pow(2,0),由于n==0,故返回1,即b2 = 1,
pow(2,0){
//满足条件,执行该部分,返回1
if(0==0){
return 1;
}
......
}
第七步:自底向上求出原问题的解 ,pow(2,0)==1,b2 == 1,b2 = b2*b2 = 1,又n==1,满足1%2==1,故b2 = b2*a = 2,return b2,故pow(2,1)==2;b1 = pow(2,1) = 2,b1 = b1*b1 = 4,return b1,故b = pow(2,2)= 4,b = b*b = 4*4 =16,return b;故pow(2,4)=16。