在Python中,如何使递归n choose k函数与大数一起工作?

在Python中,如何使递归n choose k函数与大数一起工作?,python,recursion,Python,Recursion,标题说明了一切,我的函数不能处理大数字。例如,1000 c800会使它崩溃 def choose(n, k): if n == k: return 1 elif k == 0: return 1 else: return choose(n-1, k) + choose(n-1, k-1) 您可以使用动态规划来避免反复计算相同的子问题。它是以一些空间为代价的。为了避免重复计算相同的子结果,您可以使用自下而上的迭代解决方案,构

标题说明了一切,我的函数不能处理大数字。例如,1000 c800会使它崩溃

def choose(n, k):
    if n == k:
        return 1
    elif k == 0:
        return 1
    else:
        return choose(n-1, k) + choose(n-1, k-1)

您可以使用动态规划来避免反复计算相同的子问题。它是以一些空间为代价的。

为了避免重复计算相同的子结果,您可以使用自下而上的迭代解决方案,构建一行,然后从中生成下一行

def choose(n, k):
    lst = [1] * (n+1)
    for j in range(1, n):
        for i in range(j, 0, -1):
            lst[i] += lst[i-1]
    return lst[k]

print(choose(1000, 800))
66171555606593036562716334613245883189732170301763866936478813470889179567264110578012855839131637818069532119155547233739314518470598302521758877124573075477635413546061929638829597161889636280577155889117185


这只是为了说明如何使该方法更有效,但当然有。

您可以通过划分以下因素使递归方法的性能更好:

def choose(n, k):
    if k == 0:
        return 1
    return n * choose(n-1, k-1) // k
这将使用递归关系:

这种方法将立即计算1000 c800,而不会破坏递归堆栈。但是,潜在的问题仍然存在——只是推迟到更大的数字。您可能更喜欢使用各种封闭形式的解决方案之一,例如:

from math import factorial

def choose(n, k):
    if n < k:
        n = k - n
    return factorial(n) // (factorial(k) * factorial(n-k))

通过使用数据结构存储以前的结果,任何递归解决方案都可以成为一种迭代方法。至于你问题的答案,这是重复的,不要使用递归,也不要使用迭代。存在一个封闭形式的解决方案。
from math import factorial

def choose(n, k):
    if n < k:
        n = k - n
    return factorial(n) // (factorial(k) * factorial(n-k))