我嘗試從唐納德·E·Knuth的實施Algorithm O (Oriented forests):「計算機程序設計藝術 - 第4卷,Fascile 4,生成所有樹」第24頁的向森林TAOCP - 算法在python
我的Python解決方案:
def generate_oriented_forest(n):
"""Algorithm O from Knuth TAoCP, Fascicle 4, p. 25. """
p = range(-1, n)
while True:
yield p[1:]
if p[n] > 0: p[n] = p[p[n]]
else:
k_largest = 0
for k in range(1,n):
if p[k] != 0: k_largest = k
k = k_largest
if k == 0: return
j = p[k]
d = k-j
if p[k-d] == p[j]: p[k] = p[j]
else: p[k] = p[k-d] + d
while k != n:
#print k, p
k = k+1
if p[k-d] == p[j]: p[k] = p[j]
else: p[k] = p[k-d] + d
if __name__ == "__main__":
for el in generate_oriented_forest(4):
print el
# According to page 23 and also Table 1 p.4 I would expect the sequence:
# 0123, 0122, 0121, 0120, 0111, 0110, 0101, 0100, 0000
我的實現給我:
[0,1,2,3], [0,1,2,2], [0,1,2,1], [0,1,2,0], [0,1,1,1], [0,1,1,0],
[0,1,0,3],
[0,1,0,0], [0,0,0,0 ]。
我已經尋找太久了一個錯誤。希望有人能指出我正確的方向來修復我的代碼。我對算法的理解是否正確?我的Python風格的任何改進也表示讚賞。謝謝你的幫助。
首先 - 嘗試將名稱爲「j」,「d」,「k」的所有變量重命名爲更具可讀性的名稱。它有助於解決您的問題。 – Oduvan
@Oduvan,我相信這些是在文本 –
@gnibbler中使用的變量名稱,如果您無法讀取代碼,那麼您將難以理解它,甚至錯誤修復它。 ; P –