(nk)=(n−1k−1)+(n−1k)
和斐波那切一样,也是一个递归形式给出的定义。
递归版
def Cnk(n, k):
if n == k or k == 0:
return 1
return Cnk(n-1, k-1) + Cnk(n-1, k)
动态规划版
也和斐波那切一样,递归计算存在重复计算的问题,设置记忆体,动态规划的核心思想,避免重复计算:
def Cnk(n, k, memo):
if n == k or k == 0:
return 1
if (n, k) not in memo:
memo[(n, k)] = Cnk(n-1, k-1) + Cnk(n-1, k)
return memo[(n, k)]
循环迭代版
借助 defaultdict(int) 实现对字典全局的键初始化为 0;
from collections import defaultdict
def cnk(n, k):
C = defaultdict(int)
for row in range(n+1):
C[row, 0] = 1
for col in range(1, k+1):
C[row, col] = C[row-1, col-1] + C[row-1, col]
return C[n, k]