我正在自学 Python,使用如何像计算机科学家一样思考。我正在学习“节点和链表”。 这个递归函数让我很困惑。 需要说明的是,代码运行良好。请问,怎么可能是最下面的最后一行代码(print list,)被执行了?
我的问题是关于这个递归函数:
def print_backward (list):
if list == None: return #shouldn't the code terminate when this is satisfied?
print_backward(list.next)
print list, #seems like the function would terminate before this line
#ever gets called
谁能给我解释一下,最后一行 print head, 是什么时候执行的?阅读这段代码,我会认为我们在评估每个节点后循环回到函数的顶部,然后当我们到达第 3 个也是最后一个节点时,终止语句 if list == None: return 将得到满足,然后代码将退出循环,永远不会到达最底部的 print 语句。显然,这并没有发生,因为正在调用打印语句。
我之所以问,是因为我觉得如果我不了解代码的工作原理,就不是在真正学习!如果有人可以解释代码如何到达最终打印语句(并且它到达那里),我将非常感激。我希望我问这个没有违反规则。谢谢!
顺便说一句,我正在打印一个链接列表, cargo 是 [1,2,3]。向后打印,所以 [3,2,1] 下面是更多上下文的代码。
class Node:
def __init__(self, cargo = None, next = None):
self.cargo = cargo
self.next = next
def __str__(self):
return str(self.cargo)
def print_list(node):
while node:
print node,
node = node.next
print
def print_backward (list):
if list == None: return
print_backward(list.next)
print list,
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node1.next = node2
node2.next = node3
node3.next = None
print_backward(node1)
输出是:
==== RESTART:/Users/Desktop/Programming Career/Untitled.py ====
3 2 1
请您参考如下方法:
让我们逐个节点分析代码在做什么
print_backward由node1 调用
node1 == None没有吗?不,我们继续- 我们分配
head = node1 - 我们分配
tail = node1.next与tail = node2 - 我们调用
print_backward(tail)与print_backward(node2)相同print_backward被node2调用node2 == None没有吗?不,我们继续- 我们分配
head = node2 - 我们分配
tail = node2.next与tail = node3 - 我们调用
print_backward(tail)与print_backward(node3)相同print_backward被node3调用node3 == None没有吗?不,我们继续- 我们分配
head = node3 - 我们分配
tail = node3.next与tail = None相同 - 我们调用
print_backward(tail)与print_backward(None)相同print_backward使用None 调用
- 是
None == None没有吗?是的,所以我们回来
print head,被调用,与print node3,相同(打印“3”)
print head,被调用,同print node2,(打印“2”)
print head,被调用,与print node1,相同(打印“1”)
总输出是,“3 2 1”!
