【问题标题】:Why does recursive function for travelling to front of doubly linked list not work?为什么遍历双向链表前面的递归函数不起作用?
【发布时间】: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


【解决方案1】:

好吧,看来你不是returning 递归的结果,所以函数在所有情况下都会返回默认的未初始化值。

最后一行应该是:

return firstInList(nodeInList.getBefore())

【讨论】:

  • 您的回答是我考虑过的,但它并没有真正回答所提出的问题。到达列表的firstnode 是递归的基本情况,并且函数确实 到达该基本情况,打印出firstnode.cargo 的正确值就证明了这一点。那么为什么一个简单的return firstnode 指令不够用?
  • @GregGrunberg 因为return 仅从当前函数调用(堆栈帧)返回。如果您不使用返回的值,那么它将被丢弃。但是调用它的函数必须返回一些东西。如果您没有明确说明什么,它只会根据语言(平台)返回一些值。它在 python 中返回None,它在 C\C++ 中返回一些垃圾,或者它不会在具有更严格规则的语言中编译。您还可以阅读以下文章-programmers.stackexchange.com/questions/201765/…
  • 请在代码中添加更改,以供将来参考,因为您的答案是正确的,但没有说明如何解决它
  • @holroy:我知道我忘了告诉你我这样做了!
【解决方案2】:

非常感谢内森·图吉。起初我误解了你的意思,但实际上你是对的。

更改最后一行后,我的 firstInList 函数运行良好

firstInList(nodeInList.getBefore())

阅读

return firstInList(nodeInList.getBefore()).

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

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2023-02-07
    • 1970-01-01
    • 2020-09-26
    • 2021-04-15
    • 2023-03-17
    • 2015-09-24
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多