簡體   English   中英

路徑網格數問題Python、Memory錯誤和遞歸錯誤:

[英]number of path grid problem Python, Memory Error and Recursion Error:

所以我試圖解決一個簡單的網格問題,我這樣解決:\

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)

這里 NXM 是網格的行和列,但不適合大輸入,例如。 如果我輸入---> 18X18 for 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: 獲取 object 的 str 時超出了最大遞歸深度

我得到了答案,即——>

sys.setrecursionlimit(100**8)

但在那之后,又出現了一個錯誤

error_2 2:MemoryError:堆棧溢出我不知道我知道什么,

任何幫助!

當您達到基本情況時,您應該只返回值而不是將其存儲在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]

是組合問題。 您可以計算答案,而不是遍歷整個(非常大的)樹。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM