我是刚刚完成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()
将返回错误消息
属性错误:' NoneType'对象没有属性' getCargo'
另一个数据是firstInList(node1) == node1
评估为True
;这至少就像我期望的那样。
这表明发现的firstnode
没有以我想象的方式返回递归调用链。 任何人都可以解释原因吗?
(请不要建议我使用迭代而不是递归。我知道如何做到这一点。我试图理解Python 2.7的代码行为。)
答案 0 :(得分:3)
好吧,看起来你不是return
递归的结果,所以函数将在所有情况下,但简并只返回默认的未初始化值。
最后一行应该是:
return firstInList(nodeInList.getBefore())
答案 1 :(得分:0)
非常感谢Nathan Tuggy。起初我误解了你在说什么,但事实上你是对的。
一旦我更改了最后一行,我的firstInList
功能就完美了
firstInList(nodeInList.getBefore())
阅读
return firstInList(nodeInList.getBefore())
。
考虑到我担心这个问题的荒谬时间,我认为这是我将来不太可能犯的一种错误。或者,如果我这样做,我将能够自己发现问题。