【发布时间】:2015-05-16 00:30:52
【问题描述】:
我是刚学完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 但 @987654342 @ 计算为 False。调用firstInList(node2).getCargo() 将返回错误消息
属性错误:“NoneType”对象没有属性“getCargo”
另一个数据是firstInList(node1) == node1 评估为True;至少,这是我所期望的。
这表明找到的firstnode 没有以我想象的方式返回到递归调用链。 谁能解释一下原因?
(请不要建议我使用迭代而不是递归。我知道该怎么做。我正在尝试理解 Python 2.7 对所编写代码的行为。)
【问题讨论】:
标签: python data-structures recursion