二分搜索——给定a,用二分设计法求a^n的算法

题解思路

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值