二、递归_03 &快速幂(笔记)

public class A007_快速幂 {

	public static void main(String[] args) {
		int a = 2;
		int n = 15;
		long time = System.currentTimeMillis();
		int res = pow(a, n);
		long now = System.currentTimeMillis() - time;
		System.out.println(now + " " + res);

		time = System.currentTimeMillis();
		res = pow2(a, n);
		now = System.currentTimeMillis() - time;
		System.out.println(now + " " + res);
	}

	public static int pow2(int a, int n) {//线性时间的
		int res = 1;
		for (int i = 0; i < n; i++) {
			res *= a;
		}
		return res;
	}

	public static int pow(int a, int n) {//快速幂
		if (n == 0)
			return 1;
		int res = a;
		int ex = 1;
		while ((ex << 1) <= n) {
			res = res * res;
			ex <<= 1;
		}
		return res * pow(a, n - ex);
	}
}

快速幂就是把要求的部分分开来计算,最后利用递归把他们合在一起

在例中,每一次递归的a值需要保持不变,所以把a的值保存下来,并用res表示当前值,进行运算,ex是指数,ex<<1,就表示在二进制中右移一位,只要ex右移一位,小于并且等于n的时候,就可以继续循环,反之,就退出,然后把得到的值,保存在res中,并且调用递归,递归时,采用原来的a的值,并且把要求的多少次幂的n减掉ex,表示剩下的,还没求的次幂,代入到递归式中,继续运算,如果while循环求完了,那么就会进入if语句,退出递归式,最后就会把整个结果进行运算,然后返回到主函数中进行输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值