很经典的快速幂算法,当时学的时候真是一头雾水啊难啊,不过现在看来都是菜菜,哈哈哈~

// 看offer书,突然想到一个学习快速幂算法的思路:先看书上的公式,试着递归求解,递归求解思路还是很清晰的,最最后试着看递推思路。(一上来学递推思路有点吃力)

// 递推写法
public class Solution {
    public static double Power(double base, int exp) {

        boolean flag = false;
        if (exp < 0) {
            flag = true;
            exp = -exp;
        }
        double ans = 1;
        while (exp > 0) {
            if ((exp & 1) == 1) {
                ans = ans * base;
            }
            exp >>= 1;
            base *= base;
        }
        return flag ? 1 / ans : ans;
    }
}

我竟然没写过递归的快速幂算法,成功get到新技能~

// 递归写法
public class Solution {
    public static double Power(double base, int exp) {
        boolean flag = exp < 0;
        if (flag) {
            exp = -exp;
        }
        double result = getPower(base, exp);
        return flag ? 1 / result : result;
    }

    public static double getPower(double base, int exp) {
        if (exp == 0) {
            return 1;
        }
        if (exp == 1) {
            return base;
        }
        double ans = getPower(base, exp >> 1);
        ans *= ans;
        if ((exp & 1) == 1) {
            ans *= base;
        }
        return ans;
    }
}