Nó là dễ dàng hơn để trả lời với một mô hình trong các kết quả hơn lời nói (trừ bạn muốn biết phần toán học của lý thuyết), vì vậy bản in ra sẽ là cách tốt nhất để giải thích.
Điều tinh tế nhất là, sau khi kết thúc đến cuối, nó sẽ tự đặt lại đến lượt đầu tiên của vòng cuối cùng và bắt đầu vòng lặp tiếp theo hoặc liên tục đặt lại thành lượt đầu tiên của vòng cuối cùng lớn hơn như một chiếc đồng hồ.
Phần mã làm công việc thiết lập lại:
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
toàn:
In [54]: def permutations(iterable, r=None):
...: # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
...: # permutations(range(3)) --> 012 021 102 120 201 210
...: pool = tuple(iterable)
...: n = len(pool)
...: r = n if r is None else r
...: if r > n:
...: return
...: indices = range(n)
...: cycles = range(n, n-r, -1)
...: yield tuple(pool[i] for i in indices[:r])
...: print(indices, cycles)
...: while n:
...: for i in reversed(range(r)):
...: cycles[i] -= 1
...: if cycles[i] == 0:
...: indices[i:] = indices[i+1:] + indices[i:i+1]
...: cycles[i] = n - i
...: print("reset------------------")
...: print(indices, cycles)
...: print("------------------")
...: else:
...: j = cycles[i]
...: indices[i], indices[-j] = indices[-j], indices[i]
...: print(indices, cycles, i, n-j)
...: yield tuple(pool[i] for i in indices[:r])
...: break
...: else:
...: return
một phần của kết quả:
In [54]: list(','.join(i) for i in permutations('ABCDE', 3))
([0, 1, 2, 3, 4], [5, 4, 3])
([0, 1, 3, 2, 4], [5, 4, 2], 2, 3)
([0, 1, 4, 2, 3], [5, 4, 1], 2, 4)
reset------------------
([0, 1, 2, 3, 4], [5, 4, 3])
------------------
([0, 2, 1, 3, 4], [5, 3, 3], 1, 2)
([0, 2, 3, 1, 4], [5, 3, 2], 2, 3)
([0, 2, 4, 1, 3], [5, 3, 1], 2, 4)
reset------------------
([0, 2, 1, 3, 4], [5, 3, 3])
------------------
([0, 3, 1, 2, 4], [5, 2, 3], 1, 3)
([0, 3, 2, 1, 4], [5, 2, 2], 2, 3)
([0, 3, 4, 1, 2], [5, 2, 1], 2, 4)
reset------------------
([0, 3, 1, 2, 4], [5, 2, 3])
------------------
([0, 4, 1, 2, 3], [5, 1, 3], 1, 4)
([0, 4, 2, 1, 3], [5, 1, 2], 2, 3)
([0, 4, 3, 1, 2], [5, 1, 1], 2, 4)
reset------------------
([0, 4, 1, 2, 3], [5, 1, 3])
------------------
reset------------------(bigger reset)
([0, 1, 2, 3, 4], [5, 4, 3])
------------------
([1, 0, 2, 3, 4], [4, 4, 3], 0, 1)
([1, 0, 3, 2, 4], [4, 4, 2], 2, 3)
([1, 0, 4, 2, 3], [4, 4, 1], 2, 4)
reset------------------
([1, 0, 2, 3, 4], [4, 4, 3])
------------------
([1, 2, 0, 3, 4], [4, 3, 3], 1, 2)
([1, 2, 3, 0, 4], [4, 3, 2], 2, 3)
([1, 2, 4, 0, 3], [4, 3, 1], 2, 4)
chỉ Tôi đã mất hy vọng nhưng luôn luôn có thể dựa vào Alex !! Tôi không hoàn toàn * grok * điều này được nêu ra, nhưng dẫn bạn cung cấp là rất tốt, tôi sẽ đọc về. cảm ơn rất nhiều. bạn cũng biết ai thực sự thực hiện điều này trong lib python? – zaharpopov
Raymond Hettinger: xem các dòng 2495 và theo dõi http://svn.python.org/view/python/trunk/Modules/itertoolsmodule.c?annotate=76602. –
Danh sách chu kỳ đại diện cho những gì? Là một người mất 6 học kỳ của đại số trừu tượng và biết khá nhiều về các nhóm đối xứng và chu kỳ/quỹ đạo, ký hiệu này (và mã) có nghĩa là hầu như không có gì với tôi. Tôi không thể nói chiến lược chung là gì. –