intgetPow(int x,int e){ if(e == 0){ return1; } //计算子问题 int temp = getPow(x, e / 2); int result = temp * temp; if(e % 2 != 0){ result *= x; } return result; }
1.2 迭代伪代码:
观察递归代码,可以得到递归过程类似于将指数e转化为二进制的过程
在底数转化二进制的某位为1时,对应递归子问题为奇数时乘以底数,
1 2 3
if(e % 2 != 0){ result *= x; }
在递归返回时,每向上返回一层 该位置乘的底数,都要平方一次
1
int result = temp * temp;
根据以上分析可得递归代码为
1 2 3 4 5 6 7 8 9 10 11 12 13
intgetPow(int x,int e){ int result = 1; while(e > 0){ if(e % 2 != 0){ result *= x; } //阶数向右移动 x *= x; //等价于从底向上递归 e >>= 1; } return result; }
1.3 添加了避免越界的模板
1 2 3 4 5 6 7 8 9 10 11 12 13
intgetPow(int x,int e){ int result = 1; while(e > 0){ if(e % 2 != 0){ result = result * x mod number; } //阶数向右移动 x = x * x mod number; //等价于从底向上递归 e >>= 1; } return result; }
classSolution{ publicintcountGoodNumbers(long n){ //设置初始化值 long result = 1; if(n % 2 == 1){ result = 5; } n = n / 2; long a = 20; //快速幂模板 while(n > 0){ if(n % 2 == 1){ result = result * a % 1000000007; } //右移一位 n >>= 1; a = a * a % 1000000007; } return (int)result; } }