一、概述
输入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);
}
}
};
三、总结
经典的递归实现幂函数的题目。