簡體   English   中英

為什么遞歸到雙向鏈表前面的功能不起作用?

[英]Why does recursive function for travelling to front of doubly linked list not work?

我是剛完成edX入門課程MIT 6.00.1x的新手; 以下與該課程的期末考試中的一個問題有關(現已結束,因此我可以尋求幫助)。

def class DLLNode(object):
    def __init__(self, name):
        self.cargo = cargo
        self.before = None
        self.after = None
    def setBefore(self, before):  self.before = before
    def setAfter(self, after):    self.after = after
    def getBefore(self):          return self.before
    def getAfter(self):           return self.after
    def getCargo(self):           return self.cargo

用於創建雙向鏈接列表。 假設node是出現在雙鏈表中的DLLNode類的實例。 然后, node.getBefore()返回該node在列表中的直接前任,但是如果node在列表的前面並且因此沒有前任,則返回None

我寫了一個遞歸函數

def firstInList(nodeInList):
    """ Prints out the cargo carried by the first node in that doubly linked list
    of which nodeInList is a part.  Returns that first node. """

    if nodeInList.getBefore() == None:
        firstnode = nodeInList
        print firstnode.getCargo()
        return firstnode
    # nodeInList.getBefore() is not None, so nodeInList has an immediate predecessor 
    # on which firstInList can be be called.
    firstInList(nodeInList.getBefore())

我希望返回雙向鏈接列表中的第一個節點,並以列表中的已知節點nodeInList作為參數。

我的問題是: firstInList到達正確的第一個節點,這由它打印第一個節點的貨物證明的,而與使用的特定nodeInList 但是,只要nodeInList 不是鏈表中的第一個節點, firstInList(node)的返回值就會變為None而不是所需的第一個節點。 該結論基於以下內容:例如,如果列表的第一個節點node1擁有貨物1 ,其后是node2和貨物2 ,則firstInList(node2) == None評估為TruefirstInList(node2) == node1評估為False 調用firstInList(node2).getCargo()將返回錯誤消息

屬性錯誤:“ NoneType”對象沒有屬性“ getCargo”

另一個數據是firstInList(node1) == node1值為True 至少,這是我所期望的。

這表明發現的第一個firstnode沒有按照我想象的方式返回到遞歸調用鏈中。 誰能解釋為什么?

(請不要建議我使用迭代而不是遞歸。我知道該怎么做。我試圖理解所編寫代碼的Python 2.7行為。)

好吧,看來您沒有return遞歸的結果,因此該函數在所有情況下都可以,但退化的函數僅返回默認的未初始化值。

最后一行應該是:

return firstInList(nodeInList.getBefore())

非常感謝Nathan Tuggy。 起初我誤會了你的意思,但實際上你是正確的。

一旦更改了最后一行,我的firstInList函數就可以完美運行

firstInList(nodeInList.getBefore())

讀書

return firstInList(nodeInList.getBefore())

考慮到我花了很多時間來擔心這個問題,我認為這是我將來不太可能犯的一種錯誤。 或者,如果我這樣做,我將可以自己發現問題。

暫無
暫無

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

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