繁体   English   中英

递归函数,最终打印语句

[英]Recursive function, final print statement

我正在使用如何像计算机科学家一样思考的方式自学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,何时执行? 阅读这段代码,我认为我们在评估完每个节点后会回到函数的顶部,然后当我们到达第三个节点和最后一个节点时, if list == None: return ,则终止语句if list == None: return将被满足,并且代码将然后退出循环,从不到达最底部的打印语句。 显然,这不会发生,因为正在调用print语句。

我之所以问是因为,如果我不了解代码的工作原理,那感觉就像是我不是在真正地学习! 如果有人可以解释代码如何到达最终的打印语句(并且它已经到达那里),我将非常感激。 我希望我不要通过问这个来违反规则。 谢谢!

顺便说一句,我正在打印一个链接清单,货物是[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. node1调用print_backward
  2. node1 == None无? 不,我们继续
  3. 我们分配head = node1
  4. 我们分配tail = node1.nexttail = node2相同
  5. 我们称print_backward(tail)print_backward(node2)相同
    1. node2调用print_backward
    2. node2 == None无? 不,我们继续
    3. 我们分配head = node2
    4. 我们分配tail = node2.nexttail = node3相同
    5. 我们称print_backward(tail)print_backward(node3)相同
      1. node3调用print_backward
      2. node3 == None无? 不,我们继续
      3. 我们分配head = node3
      4. 我们分配tail = node3.nexttail = None相同
      5. 我们称print_backward(tail)print_backward(None)相同
        1. None调用print_backward
        2. None == None 是的,所以我们回来
      6. print node3, 3相同print head,称为print head, (打印“ 3”)
    6. print node2, 2相同print head,称为print head, (打印“ 2”)
  6. print node1, 1相同print head,称为print head, (打印“ 1”)

总输出为“ 3 2 1”!

递归并不意味着跳到函数的顶部; 这意味着在一个函数调用相同的函数。

我认为一个更简单的示例将使其更加明显:

def count(number):
    if number <= 0: return
    count(number-1)
    print(number)

当我们调用count(3) ,该函数将打印数字1到3。为什么? 因为这是发生的情况:

  1. count(3)被调用。
  2. number是3,不小于或等于零,因此我们不return
  3. 我们称count(3-1)
    1. count(2)被调用。
    2. number为2,不小于或等于零,因此我们不return
    3. 我们称count(2-1)
      1. count(1)被调用。
      2. number为1,不小于或等于零,因此我们不return
      3. 我们称count(1-1)
        1. count(0)被调用。
        2. number为0,等于零,因此我们return上一级。
      4. 我们print 1。
    4. 我们print 2。
  4. 我们print 3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM