我正在研究 Downey 的 How To Think Like a Computer Scientist,我对他的Linked List的 print_backward() 函数有疑问。
首先,这是 Downey 在 Python 中实现的链表:
class Node:
#initialize with cargo (stores the value of the node)
#and the link. These are set to None initially.
def __init__(self, cargo = None, next = None):
self.cargo = cargo
self.next = next
def __str__(self):
return str(self.cargo)
我们给这个类以下货物和链接值:
#cargo
node1 = Node('a')
node2 = Node('b')
node3 = Node('c')
#link them
node1.next = node2
node2.next = node3
为了打印链表,我们使用了 Downey 的另一个函数。
def printList(node):
while node:
print node,
node = node.next
>>>printList(node1)
>>>a b c
一切都非常简单。但我不明白以下函数中的递归调用如何允许向后打印链表。
def print_backward(list):
if list == None : return
print_backward(list.next)
print list,
>>>print_backward(node1)
>>>c b a
调用“list.next”作为 print_backward 的值不会简单地给你“b c”吗?
注意:下面的一些人指出这个函数设计得很糟糕,因为给定任何列表,我们不能证明它总是会达到基本情况。唐尼也在同一章后面指出了这个问题。