Skip to main content
 首页 » 编程设计

python之递归函数,最终打印语句

2025年05月04日25mate10pro

我正在自学 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 

请您参考如下方法:

让我们逐个节点分析代码在做什么

  1. print_backward 由 node1
  2. 调用
  3. node1 == None 没有吗?不,我们继续
  4. 我们分配 head = node1
  5. 我们分配 tail = node1.next 与 tail = node2
  6. 我们调用 print_backward(tail) 与 print_backward(node2) 相同
    1. print_backward 被 node2 调用
    2. node2 == None 没有吗?不,我们继续
    3. 我们分配 head = node2
    4. 我们分配 tail = node2.next 与 tail = node3
    5. 我们调用 print_backward(tail) 与 print_backward(node3) 相同
      1. print_backward 被 node3 调用
      2. node3 == None 没有吗?不,我们继续
      3. 我们分配 head = node3
      4. 我们分配 tail = node3.next 与 tail = None 相同
      5. 我们调用 print_backward(tail) 与 print_backward(None) 相同
        1. print_backward 使用 None
        2. 调用
        3. 是 None == None 没有吗?是的,所以我们回来
      6. print head,被调用,与print node3,相同(打印“3”)
    6. print head,被调用,同print node2,(打印“2”)
  7. print head,被调用,与print node1,相同(打印“1”)

总输出是,“3 2 1”!