来自Software Engineering Stack Exchange的

This question was migrated,因为可以在Stack Overflow上进行回答。
                            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