[英]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
評估為True
而firstInList(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.