最近研究了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))
2. 直接递归求解
def Cnk0(n,k):
if k==0: return 1
if n==0: return 0
return Cnk0(n-1,k)+Cnk0(n-1,k-1)
3. 动态规划求解
(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)
(2)迭代求解
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 = 100k = 5 用时(秒):
1: 0.0
2:64.45168709754944
3(1):0.0019998550415039062
3(2):0.0
发现直接递归求解的速度是最慢的,这个容易想见,因为其做了很多重复运算
去掉它,再进一步对比剩下三个的速度
n = 100k = 80
用时(秒):1: 0.03(1):0.0109999179840087893(2):0.007001161575317383
n = 500k = 100
这时发现1,和3(1)都出现了maximum recursion depth exceeded in comparison错误
这是由于栈深度引起的问题
只有3(2)不存在这个问题仍能计算出结果