最近研究了python求二项式系数的几种方法,对比了一下他们的速度
1. 利用阶乘简洁求
#普通阶乘 def fact(n): if n == 0: return 1 else: return n*fact(n-1) #普通Cmn def Cmn(n,m): return fact(n)/(fact(n-m)*fact(m))
def Cnk0(n,k): if k==0: return 1 if n==0: return 0 return Cnk0(n-1,k)+Cnk0(n-1,k-1)
(1)带备忘录的
def memo(func): cache={} @wraps(func) def wrap(*args): if args not in cache: cache[args]=func(*args) return cache[args] return wrap @memo def Cnk(n,k): if k==0: return 1 if n==0: return 0 return Cnk(n-1,k)+Cnk(n-1,k-1)
def CnkD(n,k): C=defaultdict(int) for row in range(n+1): C[row,0]=1 for col in range(1,k+1): if col <= row: C[row,col]=C[row-1,col-1]+C[row-1,col] return C[n,k]
n = 100 k = 5用时(秒):
发现直接递归求解的速度是最慢的,这个容易想见,因为其做了很多重复运算
去掉它,再进一步对比剩下三个的速度
n = 100 k = 80
用时(秒):
1: 0.0
3(1):0.010999917984008789
3(2):0.007001161575317383
n = 500 k = 100这时发现1,和3(1)都出现了maximum recursion depth exceeded in comparison错误
这是由于栈深度引起的问题
只有3(2)不存在这个问题仍能计算出结果