[英]python recursion return None type
我不明白,如何返回List
而不是None
?
class foo():
def recursion(aList):
if isGoal(aList[-1]):
return aList
for item in anotherList:
newList = list(aList)
newList.append(item)
recursion(newList)
someList = [0]
return recursion(someList)
基本上代碼是記錄所有路徑(從0開始)。 誰先得到 100 將被退回。 isGoal()
是檢查路徑的最后一項是否為 100。 anotherList
是一個小的隨機數列表(從 0 到 100)。
return
語句當我第一次開始學習遞歸時,這個問題實際上花了我很長時間才掌握。
在處理 Python 函數/方法時要記住的一件事是,無論如何它們總是return
一個值。 因此,假設您忘記在函數/方法的主體中聲明return
語句,那么 Python 會為您處理它並在它的末尾return None
。
這意味着,如果您在函數體中搞砸了並且錯誤地放置了return
或省略了它,那么您的print type(messed_up_function())
將打印NoneType
而不是預期的返回NoneType
。
現在考慮到這一點,在處理遞歸時,首先確保除了歸納案例之外還有一個基本案例,即防止無限遞歸循環。
接下來,確保你在這兩種情況下都返回,所以是這樣的:
def recur(val):
"""
takes a string
returns it back-to-front
"""
assert type(val) == str
# the base case
if len(val) == 1:
return val
# the inductive case
else:
return val[-1] + recur(val[:-1]) # reverses a string char by char
所以它所做的是它總是return
s 並且是 100% 無限遞歸證明,因為它在每個歸納步驟都有一個有效的基本情況和遞減的長度。
如果我們在基本情況開始時使用添加的assert False
運行recur('big')
,我們將擁有以下堆棧結構:
從它我們可以看到,在每個遞歸步驟中,我們都有val
,它是這個函數的唯一參數,它越來越小,直到遇到len(val) == 1
,然后到達最終返回,或者在這種情況下assert False
。 所以這只是調試遞歸函數/方法的一種方便的方法。 在IDLE 中,您可以通過在 shell 中調用Debug > Stack Viewer
來訪問這樣的視圖。
功能是這樣的:
def recursion(aList):
if isGoal(aList[-1]):
return aList
for item in anotherList():
newList = list(aList)
newList.append(item)
recursion(newList) # here you ignore what recursion returns
# when execution reaches this point, nothing is returned
如果執行到達我添加的注釋,則在 for 循環完成后,函數退出並且不返回任何內容。 當你在沒有執行return
語句的情況下退出函數時, None
被返回。 您必須確保從遞歸函數中返回一些內容。
我無法建議您如何重寫該函數,因為我不知道它要做什么。 對我來說,它需要如何改變還很不明顯。 但是,我可以完全自信地說,您必須返回一些東西!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.