递归函数,最终打印语句

时间:2017-02-11 19:34:58

标签: python linked-list nodes tail-recursion

我自学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语句。显然,这并没有发生,因为正在调用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

2 个答案:

答案 0 :(得分:3)

让我们解析代码逐节点地做什么

    使用print_backward 调用
  1. node1
  2. node1 == None没有?不,我们继续
  3. 我们指定head = node1
  4. 我们将tail = node1.next指定为tail = node2
  5. 我们将print_backward(tail)称为print_backward(node2)
      使用print_backward 调用
    1. node2
    2. node2 == None没有?不,我们继续
    3. 我们指定head = node2
    4. 我们将tail = node2.next指定为tail = node3
    5. 我们将print_backward(tail)称为print_backward(node3)
        使用print_backward 调用
      1. node3
      2. node3 == None没有?不,我们继续
      3. 我们指定head = node3
      4. 我们将tail = node3.next指定为tail = None
      5. 我们将print_backward(tail)称为print_backward(None)
          使用print_backward 调用
        1. None
        2. None == None没有?是的,所以我们返回
      6. print head,被调用,与print node3,相同(打印" 3")
    6. print head,被调用,与print node2,相同(打印" 2")
  6. print head,被调用,与print node1,相同(打印" 1")
  7. 总输出是" 3 2 1"!

答案 1 :(得分:2)

递归并不意味着跳到函数的顶部;它意味着在函数中调用相同的函数

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

graphql-js

当我们拨打def count(number): if number <= 0: return count(number-1) print(number) 时,该功能会打印数字1到3.为什么?因为这是发生的事情:

  1. count(3)被召唤。
  2. count(3)为3,不低于或等于零,所以我们不要number
  3. 我们致电return
    1. count(3-1)被召唤。
    2. count(2)为2,不低于或等于零,因此我们不会number
    3. 我们致电return
      1. count(2-1)被召唤。
      2. count(1)为1,不低于或等于零,所以我们不要number
      3. 我们致电return
        1. count(1-1)被召唤。
        2. count(0)为0,等于零,因此我们number为上一级。
      4. 我们return 1。
    4. 我们print 2。
  4. 我们print 3。