我试图在课程中理解如何阅读下面的函数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,
之前都会进行递归调用?请教我,因为我正在努力理解在我的课程中给我的例子。谢谢!
答案 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名称(list
和next
)。
答案 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。