Tôi đã giải quyết một câu đố lập trình liên quan đến kết hợp. Nó dẫn tôi đến một chức năng tuyệt vời itertools.combinations
và tôi muốn biết nó hoạt động như thế nào dưới mui xe. Tài liệu nói rằng các thuật toán tương đương với những điều sau đây:Thuật toán cho itertools.combinations trong Python
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
Tôi có ý tưởng: chúng ta bắt đầu với sự kết hợp rõ ràng nhất (r
yếu tố đầu tiên liên tiếp). Sau đó, chúng tôi thay đổi một (cuối) mục để có được mỗi sự kết hợp tiếp theo.
Điều tôi đang gặp phải là vòng lặp có điều kiện bên trong for
.
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
Thử nghiệm này là rất ngắn và tôi nghi ngờ đó là nơi tất cả các phép thuật xảy ra. Xin vui lòng, cho tôi một gợi ý để tôi có thể tìm ra.
Lưu ý rằng đây chỉ là một phần của vòng lặp. Chỉ từ bit đó, có vẻ như nó sẽ phá vỡ phần lớn thời gian, nhưng thay vào đó, lệnh ngắt sẽ ngăn trở lại trong ['else'] (https://docs.python.org/2/tutorial/controlflow.html# break-and-continue-statements-và-else-clauses-on-loops) xảy ra. –