簡體   English   中英

python遞歸返回None類型

[英]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.

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