来自Software Engineering Stack Exchange的
This question was migrated,因为可以在Stack Overflow上进行回答。
Migrated 4年前。
我是刚完成edX入门课程MIT 6.00.1x的新手;以下与该课程的期末考试中的一个问题有关(现已结束,因此我可以寻求帮助)。让
用于创建双向链接列表。假设
我写了一个递归函数
我希望返回双向链接列表中的第一个节点,并以列表中的已知节点
我的问题是:
属性错误:“ NoneType”对象没有属性“ getCargo”
另一个数据是
这表明发现的
(请不要建议我使用迭代而不是递归。我知道该怎么做。我试图理解所编写代码的Python 2.7行为。)
Migrated 4年前。
我是刚完成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
将返回错误消息属性错误:“ NoneType”对象没有属性“ getCargo”
另一个数据是
firstInList(node2).getCargo()
评估为firstInList(node1) == node1
;至少,这是我所期望的。这表明发现的
True
并没有像我想象的那样返回到递归调用链中。谁能解释为什么?(请不要建议我使用迭代而不是递归。我知道该怎么做。我试图理解所编写代码的Python 2.7行为。)
最佳答案
好吧,看来您不是要递归的结果,因此该函数在所有情况下都可以,但退化的函数只是返回默认的未初始化值。
最后一行应该是:
return firstInList(nodeInList.getBefore())
08-03 12:05