递归节点

问题描述:

我想在本课中了解如何读取下面的函数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应该被忽略,因为节点1包含到节点的引用,以便我们继续前进到head = list这是node1。 tail = list.next我认为它是node1.next = node2,所以tail = node2。然后我们到达printBackward(tail)这是node2。那时候会发生什么?我们是否再一次这样做?我看到这会上升到node3,那个时候会返回None。我们什么时候去print head, ???我们在进入print head,之前进行递归调用?请教我,因为我想了解在课程中给我的例子。谢谢!

对于在调用printBackward(node3)时发生的一切,您是正确的。发生什么事是每次你进行递归调用printBackward()时,你都会深入调用堆栈。在递归停止调用printBackward()之前,最终的print实际上并没有被调用,然后展开。每当它返回,那么print被调用,这就是为什么你得到倒序。 print发生在调用堆栈的展开过程中。 当你到达node3tail变成None,并且下一个printBackwards()的呼叫是马上返回,并开始打印。

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

也是一个小纸条,你遮蔽了几个内置Python名(listnext)。

+0

所以当我们调用printBackward(node3)时,如果列表THEN等于None,对吧?那么它不会没有任何回报?我可能在看这个明显的例子,但是我没有看到这个代码是如何设置的,以便开始向后打印,因为我们已经到达了一个包含None的节点3,这看起来是程序的结尾? –

+1

注意到您实际上对这些代码的返回值感兴趣。你只需调用printBackward()。当它返回时,它仅从该特定呼叫返回。如果它结束了,它也会返回None。无论哪种方式,该调用每次都返回None,只是当它离开函数 – jdi

+0

时,我遇到的问题是,它正在存储node1和node2,因为我们碰到了node3并将其打印出来。所以它在没有印刷的情况下建立起来,直到我们到达一个没有任何进一步的列表为止,因此它印刷了建立在这一点上的内容?它是如何知道以3,2,1而不是1,2,3开始的? –

递归调用函数本身。所以让我们看看printBackward函数的调用顺序。

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

正如你所看到的,printBackward1被称为与节点1作为参数。在打印node1之前,它将控制流赋予printBackward(node2)。当printBackward(node2)完成时,它会打印node1。