leetcode 50. Pow(x, n)

 

 递归:

class Solution {
public:
    double myPow(double x, int n) {
        if(n==0) return 1;
        if(n<0)
            return 1/myPow(x,-n);
        if(n&1==0)
            return myPow(x*x,n/2);
        return x*myPow(x,n-1);
    }
};

 迭代:

class Solution {
public:
    double myPow(double x, int n) {
        double res=1.0;
        int p=n;
        while(p){
            if(p&1==1)
                res*=x;
            p/=2;if(p==0) break;
            x*=x;
        }
        return n>0?res:1/res;
    }
};

这道题目应该使用迭代方法,因为使用递归方法会出现stack overflow(并不是说递归的代码是错误的,事实上递归的代码大多数样例可以正确运行)

正确的递归如下:

/**
递归法:O(logn)
**/
class Solution {
public:
    double myPow(double x, int n) {
        if (n==0) return 1;
        double t = myPow(x,n/2);
        if (n%2) {
            return n<0 ? 1/x*t*t : x*t*t;
        } else {
            return t*t;
        }
    }
};

 

 

posted @ 2019-04-07 12:15  Joel_Wang  阅读(199)  评论(0编辑  收藏  举报