我正在通過唐尼的如何像計算機科學家一樣思考,我對Linked List有一個關於他的print_backward()函數的問題。此功能爲什麼向後打印鏈接列表?
首先,這裏唐尼在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
要打印的鏈表,我們用另一種唐尼的職能。
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」?
注意:下面幾個人指出,這個函數設計的很糟糕,因爲給定任何列表,我們不能表明它總是會達到基本情況。唐尼在同一章的後面也指出了這個問題。
正如其他答案所指出的那樣,這個函數是遞歸的說明,但是也有一些缺陷:不是尾遞歸(會在長列表上導致堆棧溢出錯誤),類節點應該從'object'繼承,'' list'不應該被用作變量名稱。 – jrouquie 2012-07-19 21:26:00