递归节点
我想在本课中了解如何读取下面的函数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
发生在调用堆栈的展开过程中。 当你到达node3
,tail
变成None
,并且下一个printBackwards()
的呼叫是马上返回,并开始打印。
printBackward(node1)
printBackward(node2)
printBackward(node3)
printBackward(None)
print node3
print node2
print node1
也是一个小纸条,你遮蔽了几个内置Python名(list
和next
)。
递归调用函数本身。所以让我们看看printBackward函数的调用顺序。
printBackward(node1)
|
+-> printBackward(node2)
|
+-> printBackward(node3)
|
+-> printBackward(None)
print node3
print node2
print node1
正如你所看到的,printBackward1被称为与节点1作为参数。在打印node1之前,它将控制流赋予printBackward(node2)。当printBackward(node2)完成时,它会打印node1。
所以当我们调用printBackward(node3)时,如果列表THEN等于None,对吧?那么它不会没有任何回报?我可能在看这个明显的例子,但是我没有看到这个代码是如何设置的,以便开始向后打印,因为我们已经到达了一个包含None的节点3,这看起来是程序的结尾? –
注意到您实际上对这些代码的返回值感兴趣。你只需调用printBackward()。当它返回时,它仅从该特定呼叫返回。如果它结束了,它也会返回None。无论哪种方式,该调用每次都返回None,只是当它离开函数 – jdi
时,我遇到的问题是,它正在存储node1和node2,因为我们碰到了node3并将其打印出来。所以它在没有印刷的情况下建立起来,直到我们到达一个没有任何进一步的列表为止,因此它印刷了建立在这一点上的内容?它是如何知道以3,2,1而不是1,2,3开始的? –