【问题标题】:number of path grid problem Python, Memory Error and Recursion Error:路径网格问题Python数,内存错误和递归错误:
【发布时间】:2021-07-21 02:22:47
【问题描述】:

所以我尝试解决一个简单的网格问题,我这样解决:\

def grid_count (n,m):
    if m == 1 and n == 1:
        return 1
    if m == 0 or n == 0:
        return 0
    return grid_count(m-1,n) + grid_count(m,n-1)

这里 N X M 是网格的行和列,但不适合大输入 例如。如果我输入---> 18X18 用于 N 和 M 它会给我一个运行时错误所以我用 动态方法 和

dic ={}
def grid_count (n,m):
    # key  = str(n)+","+str(m)
    key = n*m
    if key in dic:
        return dic[key]
    if m == 1 and n == 1:
        dic[key] = 1
    if m == 0 or n == 0:
        dic[key] = 0
    dic[key] = grid_count(m-1,n) + grid_count(m,n-1)
    return dic[key]

如果我这样做,我有 2 种错误

error_1 1 : RecursionError: 获取对象的str时超出了最大递归深度

我得到了答案 即--->

sys.setrecursionlimit(100**8)

但在那之后又出现了一个错误

error_2 2:内存错误:堆栈溢出 我不知道我知道什么,

任何帮助!

【问题讨论】:

  • 这似乎是一个阶乘结果。即它会变大并迅速耗尽堆栈深度和内存 - 你应该对这个问题有这个问题。查看this问题的答案。

标签: python dynamic grid dynamic-programming


【解决方案1】:

这是一个组合问题。您可以计算答案,而不是遍历整个(非常大的)树。

from math import factorial

def grid_count(n,m):
    if m == 1 and n == 1:
        return 1
    if m == 0 or n == 0:
        return 0
    return grid_count(m-1,n) + grid_count(m,n-1)

def grid_calc(n,m):
    m -= 1
    num = factorial(m + n - 1)
    den = factorial(m) * factorial(n - 1)
    return num//den

for c in [grid_count, grid_calc]:
    print(c(12,12))

时间是

%%timeit
grid_count(12,12)
# 364 ms ± 1.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
grid_calc(12,12)
# 503 ns ± 3.88 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

【讨论】:

    【解决方案2】:

    当您达到基本情况时,您应该只返回值而不是将其存储在 dic.:

        if m == 1 and n == 1:
            return 1
        if m == 0 or n == 0:
            return 0
    

    或者,您可以使用已知值初始化dic

    dic = {0: 0, 1: 1}
    def grid_count (n,m):
        key = n*m
        if key in dic:
            return dic[key]
        dic[key] = grid_count(m-1,n) + grid_count(m,n-1)
        return dic[key]
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 2021-05-19
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多