一、概述
輸入x和n,輸出。
這個簡單啊,我直接return pow(x,n)不就得了。受之前的刺激,以能完成功能爲第一要素,直接調用math的pow函數。
還真成,時間擊敗100%空間擊敗5%。
但是明顯是讓自己寫的。所以我由乖乖自己寫了一遍:
二、分析
冪函數的具體實現沒什麼好說的,遞歸就行。
以爲例:
冪函數的元操作肯定是乘法,關鍵是如何用盡可能少的元操作把結果計算出來——反正最多就用n次元操作,但是能少當然好了。怎麼讓操作變少呢?
看上面這個式子,最開始元操作爲*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);
}
}
};
三、總結
經典的遞歸實現冪函數的題目。