我剛剛完成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
,除了它返回None
,如果node
位於列表的前面並且沒有前導。
我已經寫了遞歸功能
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()
將返回一個錯誤信息
Attribute Error: 'NoneType' object has no attribute 'getCargo'
另一個基準是firstInList(node1) == node1
評估爲True
;至少,這是我所期望的。
這表明firstnode
發現沒有以我想象的方式返回遞歸調用鏈。 任何人都可以解釋爲什麼?
(請不要建議我使用迭代而不是遞歸。我知道該怎麼做。我想了解的Python 2.7的行爲的代碼寫的。)
[遞歸函數調用中返回語句的原因]的可能重複(http://programmers.stackexchange.com/questions/201765/reason-for-return-statement-in-recursive-function-call) – 2015-03-12 08:20:45