递归(-)数值的整数次方

来源:互联网 发布:人工智能程序如何编写 编辑:程序博客网 时间:2024/06/06 15:35

问题:实现函数 double Power(double base, int exponet),求base的exponet次方。不考虑大数问题。

分析:

1)exponet=0, 值为0

2)exponet>0, 求指数次方

3)exponet<0, 求base的-exponet次方的倒数

注意:求倒数时,分母不能为0,即base=0的情况,因此要注意该特殊情况。

代码实现如下:时间复杂度是O(n)

public double Power(double base,int exponet){//base=0,exponet<0if(equal(base,0.0) && exponet<0)return 0.0;//exponet<0int  absExponet=exponet;if(exponet<0)absExponet=-exponet;double result=PowerAbsExponet(base,absExponet);if(exponet<0)result=1.0/result;return result;}//end Power()private boolean equal(double num1,double num2){if( (num1-num2>-0.0000001) && (num1-num2<0.0000001) )return true;else return false;}//end equal()//loop, time consume:O(n)private double PowerAbsExponet(double base,int absExponet){double result=1.0;for(int i=0;i<absExponet;i++)result*=base;return result;}//end  PowerAbsExponet()////recursion, time consume:O(n)//private double PowerAbsExponet(double base,int absExponet){////base case //if(absExponet==0)//return 1;//if(absExponet==1)//return base;//else{//return PowerAbsExponet(base, absExponet-1)*base;//}//end else//}//end  PowerAbsExponet()
注意:由于计算机表示小数都有误差,不能直接用等号(===)判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为他们相等。如上面代码中的equal方法。

上面代码中的时间复杂度为O(n),有没有更高效率的算法?我们可以用下面公式计算


//recursion, time consume:O(logn)private double PowerAbsExponet(double base,int absExponet){//base case if(absExponet==0)return 1;if(absExponet==1)return base;else{if(absExponet%2==0) // absExponet & 0x1 ==0 return PowerAbsExponet(base*base, absExponet/2); //absExponet<<2elsereturn PowerAbsExponet(base*base, absExponet/2)*base;}//end else}//end  PowerAbsExponet()
时间复杂度为O(logn)



原创粉丝点击