def make_table(n,m): return [[None]*m for i in range(n)] def choose(n, k): if k == 0: return 1 elif n == 0: return 0 else: return choose(n-1, k-1) + choose(n-1, k) def memoizedChoose(m, i): table = make_table(m+1, i+1) def choose(n, k): if table[n][k] == None: if k == 0: table[n][k] = 1 elif n == 0: table[n][k] = 0 else: table[n][k] = choose(n-1, k-1) + choose(n-1, k) return table[n][k] return choose(m, i) def dpChoose(m, i): table = make_table(m+1, i+1) for n in range(m+1): for k in range(i+1): if k == 0: table[n][k] = 1 elif n == 0: table[n][k] = 0 else: table[n][k] = table[n-1][k-1] + table[n-1][k] return table[m][i]