快速幂算法,真的牛皮,幂不断除以2取整,如果当前为偶数,则返回当前幂一半的值的数,再平方,若是奇数,那再乘上1个x好了,递归代码如下

class Solution {
public:
    double generate(double x,int n)
    {
        if(!n)
        return 1;
        double y = generate(x,n/2);
        if(n%2 == 0)
        return y*y;                   
        else
        return y*y*x;
    }
    double myPow(double x, int n) 
    {
        if(n > 0)
        return generate(x,n);
        else 
        return 1/generate(x,n);                      
    }
};

迭代的方法很透。因为这一方法是自顶向下的,而迭代算法在这里对于处理自顶向下的是比较困难的。而我们在快速幂的分析过程中,可以得出这样一个结论,最后的结果是由n个x经过不同次数的平方之后相乘得到的,而这一思路则可以通过二进制来描述,对于某一个数的二进制表示,其不同位上的1代表有一个x经过了几次平方后为这个数作出贡献,比如第四位是1,就代表x^8参与了运算,有一个x经过了4次平方,与其他分量乘在一起,达到了效果。贴代码

 1 class Solution {
 2 public:
 3     double generate(double x,long long n)
 4     {
 5         if(x == 1)
 6         return 1;
 7         double res = 1.0;
 8         double temp = x;
 9         while(n>0)
10         {
11             if(n % 2 == 1)
12             res *= temp;
13             temp *= temp;
14             n /= 2;
15         } 
16         return res;
17     }
18     double myPow(double x, int n) 
19     {
20         if(n == 0)
21         return 1;
22         long long N = n;
23         return n>=0?generate(x,N):1.0/generate(x,-N);                           
24     }
25 };

在变量类型上的处理有一些问题,需要注意。