【正确答案】方法一:蛮力法
可以把n的取值分为如下几种情况:
(1)n=0,那么计算结果肯定为1;
(2)n=1,计算结果肯定为d;
(3)n>0,计算方法为:初始化计算结果result=1,然后对result执行n次乘以d的操作,得到的结果就是d的n次方;
(4)n<0,计算方法为:初始化计算结果result=1,然后对result执行|n|次除以d的操作,得到的结果就是d的n次方;
以2的3次方为例,首先初始化result=1,接着对result执行三次乘以2的操作:result=result*2=1*2=2,result=result*2=2*2=4,result=result*2=4*2=8,因此,2的3次方等于8。根据这个思路给出实现代码如下:
"""
方法功能: 计算一个数的n次方
输入参数: d为底数, n为幂
返回值: d^n
"""
def power(d,n):
if n==0: return 1
if n==1: return d
result=1.0
if n>0:
i=1
while i<=n:
result*=d
i+=1
return result
else:
i=1
while i<=abs(n):
result result/d
i+=1
return result
if __name__=="__main__":
print power(2,3)
print power(-2,3)
print power(2,-3)
程序的运行结果为:
8
-8
0.125
算法性能分析:
这种方法的时间复杂度为O(n),需要注意的是,当n非常大的时候,这种方法的效率是非常低下的。
方法二:递归法
由于方法一没有充分利用中间的计算结果,因此,算法效率还有很大的提升余地。例如在计算2的100次方的时候,假如已经计算出了2的50次方的值tmp=250,就没必要对tmp再乘以50次2,可以直接利用tmp*tmp就得到了2100的值。可以利用这个特点给出递归实现方法如下:
(1)n=0,那么计算结果肯定为1;
(2)n=1,计算结果肯定为d;
(3)n>0,首先计算2n/2的值tmp,如果n为奇数,那么计算结果result=tmp*tmp*d,如果n为偶数,那么计算结果result=tmp*tmp;
(4)n<0,首先计算2|n/2|的值tmp,如果n为奇数,那么计算结果result=1/(tmp*tmp*d),如果n为偶数,那么计算结果result=1/(tmp*tmp)。
根据以上思路实现代码如下:
def power(d,n):
if n==0: return 1
if n==1:return d
tmp=power(d,abs(n)/2)+0.0
#print tmp
if n>0:
if n%2==1: #n为奇数
return tmp*tmp*d
else: #n为偶数
return tmp*tmp
else:
if n%2==1:
print 1/(tmp*tmp*d)
return 1/(tmp*tmp*d)
else:
return 1/(tmp*tmp)
算法性能分析:
这种方法的时间复杂度为O(logn)。
【答案解析】[考点] 如何计算一个数的n次方