为什么到双向链表前面的递归函数不起作用?

时间:2015-03-12 04:47:01

标签: python data-structures recursion

我是刚刚完成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的代码行为。)

2 个答案:

答案 0 :(得分:3)

好吧,看起来你不是return递归的结果,所以函数将在所有情况下,但简并只返回默认的未初始化值。

最后一行应该是:

return firstInList(nodeInList.getBefore())

答案 1 :(得分:0)

非常感谢Nathan Tuggy。起初我误解了你在说什么,但事实上你是对的。

一旦我更改了最后一行,我的firstInList功能就完美了

  

firstInList(nodeInList.getBefore())

阅读

  

return firstInList(nodeInList.getBefore())

考虑到我担心这个问题的荒谬时间,我认为这是我将来不太可能犯的一种错误。或者,如果我这样做,我将能够自己发现问题。