【LeetCode】50. Pow(x, n) 幂函数的递归实现

一、概述

输入x和n,输出x^n

这个简单啊,我直接return pow(x,n)不就得了。受之前的刺激,以能完成功能为第一要素,直接调用math的pow函数。

还真成,时间击败100%空间击败5%。

但是明显是让自己写的。所以我由乖乖自己写了一遍:

二、分析

幂函数的具体实现没什么好说的,递归就行。

2^{10}为例:

幂函数的元操作肯定是乘法,关键是如何用尽可能少的元操作把结果计算出来——反正最多就用n次元操作,但是能少当然好了。怎么让操作变少呢?

2^{10}=(2^{2})^{5}=((2^{2})^{2})^{2}*2^{2}

看上面这个式子,最开始元操作为*2,但是n可以被2整除,那元操作可以变为*4;元操作为*2时要执行10次,而元操作为*4时要执行5次——这样就把操作次数减半了。那元操作能不能变成*16呢?不能直接变,因为5次不能被2整除,所以我需要先执行一次*4,剩下4次*4,就可以变成2次*16了。2次*16又可以变为1次*256。所以说,十次*2最后变成了一次*4和1次*256,仅需四次就可以完成求幂的运算。

递归实现时,递归出口为n=1,直接返回就行,如果n>1,那么分两种情况:若n能被2整除,那么返回调用(x*x,n/2);否则返回x*调用(x,n-1)。

第一次递归:2*2*2*2*2*2*2*2*2*2(2,10)→第二次递归4*4*4*4*4(4,5)→第三次递归4*16*16(4*(4,4)=4*(16,2))→第四次递归4*256(4*(256,1))→返回1024。

另外有一点要注意:n最小为INT_MIN时,取绝对值会溢出,因此要拎出来单独处理。

代码如下:

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

三、总结

经典的递归实现幂函数的题目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章