私は、Donald E. Knuth のAlgorithm O (Oriented forests)を実装しようとしています: 'The Art of Computer Programming - Volume 4, Facile 4, Generating All Trees' on page 24.
私の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スタイルの改善も高く評価されています。ご協力いただきありがとうございます。