【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);
        }
    }
};

三、總結

經典的遞歸實現冪函數的題目。

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