递归节点

时间:2011-10-12 00:38:05

标签: python recursion nodes

我试图在课程中理解如何阅读下面的函数printBackward。当我输入printBackward(node1)并且我的输出是3,2,1这是它想要做的时候是怎么回事?我只是不明白为什么会这样。请参阅下文我如何解释它并请我在哪里看错了...

 class Node:
    def __init__(self, cargo = None, next = None): # optional parameters. cargo and the link(next) are set to None.
        self.cargo = cargo
        self.next = next

    def __str__(self):
        return str(self.cargo)


node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node1.next = node2
node2.next = node3

# Exercise
def printList(node):

    print "[",
    while node:
        print node,
        node = node.next
        if node != None:
            print ",",
    print "]",
    print


def printBackward(list):
    if list == None: return
    head = list      
    tail = list.next 
    printBackward(tail) 
    print head,

因此,首先要假设printBackward(node1)if list应该被忽略,因为node1包含对node2的引用,因此我们移动到head = list即node1。 tail = list.next我认为是node1.next = node2所以tail = node2。然后我们到达printBackward(tail),即node2。那时,会发生什么?我们这样做了吗?我看到这会进入node3,此时将返回None。我们什么时候到print head, ???我们甚至在到达print head,之前都会进行递归调用?请教我,因为我正在努力理解在我的课程中给我的例子。谢谢!

2 个答案:

答案 0 :(得分:2)

在调用printBackward(node3)之前发生的所有事情都是正确的。发生了什么事情是每次进行递归printBackward()调用时,您都会深入调用堆栈。在递归停止调用print之后,最终printBackward()实际上不会被调用,然后展开。每当它返回时,那么调用print,这就是你得到倒退顺序的原因。 print在调用堆栈的展开期间发生。 当您到达node3时,tail变为None,下次调用printBackwards()即可立即返回,并开始打印。

printBackward(node1)
    printBackward(node2)
        printBackward(node3)
            printBackward(None)
        print node3
    print node2
print node1

同样是一个小小的注释,你正在隐藏一些内置的python名称(listnext)。

答案 1 :(得分:2)

递归就是调用函数本身。那么让我们看看printBackward函数的调用顺序。

printBackward(node1)
 |
 +-> printBackward(node2)
      |
      +-> printBackward(node3)
           |
           +-> printBackward(None)
          print node3
     print node2
print node1

如您所见,使用node1作为参数调用printBackward1。在打印node1之前,它将控制流提供给printBackward(node2)。当printBackward(node2)完成时,它会打印node1。