50. Pow

recursive squaring method. 直接x * pow(x, n - 1)O(n)的复杂度 ,会发生maximum recursion depth exceeded,如测试用例1.00001 123456,所以对输入n减半处理,并进行奇偶判断。比如16=4*4,只要对4进行相乘即可求出结果。

public double myPow(double x, int n) {
    if (n < 0) return 1/dfs(x, -n);
    return dfs(x, n);
}

public double dfs(double x, int n) {
    if (n == 0) return 1;
    if (n == 1) return x; // 这个base case有时候可以减少一次递归
    double v = dfs(x, n >>> 1); // n/2
    if ((n & 1) == 0) {  // n % 2 == 0 注意优先级 & < ==
        return v * v;
    } else {
        return v * v * x;
    }
}

一个例子

1.00001 123456
1.00001 61728
1.00001 30864
1.00001 15432
1.00001 7716
1.00001 3858
1.00001 1929
1.00001 964
1.00001 482
1.00001 241
1.00001 120
1.00001 60
1.00001 30
1.00001 15
1.00001 7
1.00001 3
3.4368447520767935

>>出错

1.00000
-2147483648

results matching ""

    No results matching ""