有人可以幫忙嗎,我不知道為什么會出現此錯誤:
def sum_list(the_list):
if not the_list:
return 0
else:
mid = len(the_list) // 2
return sum_list(the_list[:mid]) sum_list(the_list[mid:])
print(sum_list([10, 20, 30]))
uj5u.com熱心網友回復:
如果the_list長度為 1(這將在您的遞回呼叫的某個階段發生),您將最終陷入無限遞回......(mid將是0)。
您需要解決這個問題以及基本情況:
def sum_list(the_list):
if not the_list:
return 0
if len(the_list) == 1:
return the_list[0]
else:
mid = len(the_list) // 2
return sum_list(the_list[:mid]) sum_list(the_list[mid:])
我認為這是一個遞回練習。python 提供sum有效地做到這一點。
uj5u.com熱心網友回復:
解決方案
你會得到一個長度為 1 的串列的無限遞回,因為the_list[1 // 2:]會回傳the_list[0:]同一個串列
關于錯誤的一些背景
呼叫函式的代價是創建一個新框架(呼叫堆疊)。Python 中有一個軟限制,可以防止它創建太多幀,默認情況下這個限制是 1000。
您可以提高此限制,但非常不鼓勵這樣做,因為它可能導致解釋器在更高的值上崩潰。
uj5u.com熱心網友回復:
我采用了您的功能并添加了一些print有助于說明問題所在的陳述句。
def sum_list(the_list, depth=1):
print(" The list: ", the_list, "at depth: ", depth)
if not the_list:
print(" List empty at depth", depth)
return 0
else:
mid = len(the_list) // 2
print(" Splitting list at ", depth, "into ", the_list[:mid], " and ", the_list[mid:])
return sum_list(the_list[:mid], depth 1) sum_list(the_list[mid:], depth 1)
print(sum_list([10, 20, 30]))
如果您運行此代碼,您將能夠看到the_list每次呼叫的值,sum_list()這有助于說明為什么遞回是無限的。
uj5u.com熱心網友回復:
在嘗試除錯函式時,有時在print其中粘貼一條陳述句以查看它是如何被呼叫的會很有用。我們期望這個函式最終應該回傳,因為它最終會減少到基本情況,即一個空串列。這會發生嗎?
def sum_list(the_list):
print(f"Summing {the_list}")
...
印刷:
...
Summing [10]
Summing []
Summing [10]
Summing []
Summing [10]
Summing []
...
RecursionError: maximum recursion depth exceeded while calling a Python object
這告訴我們,對 1 項長的串列求和可能有問題。讓我們一步一步地分析這個邏輯:
>>> the_list = [10]
>>> mid = len(the_list) // 2
>>> the_list[:mid]
[]
>>> the_list[mid:]
[10]
因此,當我們對 進行遞回時[10],我們最終將[10]再次進行另一個遞回呼叫,這將無限重復。為了解決這個問題,我們需要擴展我們的基本案例:
if len(the_list) == 1:
return the_list[0]
請注意,如果我們的基本情況只回傳零,那么遞回呼叫就不可能回傳任何不是零和的東西!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460999.html
上一篇:通過傳輸n段最大化7段顯示的數量
下一篇:找到覆寫所有段的最小點數
