剑指Offer刷题笔记(java实现)_16.数值的整数次方
题目很简单,我们要求出一个数值的整数次方
思路:最简单的就是通过一个循环,每次循环乘上一个底数,最后就得到了我们想要的结果
但是这样的方法并不高效率,我们之前学习过斐波那契数列,和这个有些类似
我们发现一个数的16次方就等于8次方乘8次方,8次方有等于4次方*4次方。我们会发现这样的计算方法高效很多。
既然是一个大问题向下分解,分解为多个小问题, 那么我们就是使用递归
注意:如果我们接受一个指数为负数的数值,那么我们要先当做正数处理,处理结束后求它的倒数,那么这样计算有个问题,如果底数为0,求他的倒数将会出现错误,因此这种特殊情况需要处理
package numberpower;
public class NumPowTest {
public static void main(String[] args) {
System.out.println(fib(2,-2)) ;
}
public static double fib(double base, int exponent){
int absExponent=Math.abs(exponent);
if (base==0&&exponent<0){
try {
throw new Exception("输入的数值不合法");
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
System.exit(1); ;;
}
}
if (absExponent==1){//递归结束条件
return base;
}
double result=fib(base,absExponent>>1);
result=result*result;
if ((absExponent&1)==1){//如果是奇数
result*=base;//再乘a
}
if (exponent<0)//如果指数是负数,则取倒数
result=1/result;
return result;
}
}
我们递归处也要分情况
如果指数为奇数或者偶数也要分情况处理