这个题目有很简单,就是实现一个指数运算方法,但是对于递归次数和运算时间有约束。
指数运算,就是pow(x,n), x可以是浮点数,输入为x为2.000,n为10,返回1024.000;其中指数n可以为负数。
Input: 2.00000, 10
Output: 1024.00000
其实python默认内置的指数计算符号是**,比如上面就是2.000**10;直接就是用return x**n提交竟然也通过了,还比62%的时间快。
想想当然不是那么搞得,思考了下,直接一个一个乘积计算必定超过运算效率约束;可以用二分法,比如pow(x,n),如果n为偶数,可以分为pow(x,n/2)*pow(x,n/2);如果n非偶数就是多乘一次x,其他就是偶数。然后在使用缓存字典方法,避免重复计算。
在后面计算时候发现,测试系统是不会每次计算不同(x,n)都新建对象来刷新缓存字典,造成第二次的(x,n)都使用第一次的缓存字典;所以每次新的的(x,n)的时候都情况下缓存字典。
提交后,发现比87%的提交答案都快。和用python自带的n**x 对比也是快那么一些。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class Solution: cacheDict = {} def myRecursion( self ,x,n): if n in self .cacheDict.keys(): return self .cacheDict[n] if n % 2 = = 1 : productRe = self .myRecursion(x, (n - 1 ) / 2 ) * self .myRecursion(x, (n - 1 ) / 2 ) * x else : productRe = self .myRecursion(x, n / 2 ) * self .myRecursion(x, n / 2 ) self .cacheDict[n] = productRe return productRe def myPow( self , x, n) - > float : if n < 0 : self .cacheDict = { 0 : 1 , 1 : 1 / x} return self .myRecursion( 1.0 / x, abs (n)) else : self .cacheDict = { 0 : 1 , 1 :x} return self .myRecursion(x, n) |
原文:https://www.cnblogs.com/chenguopa/p/15239858.html