Không rõ ràng với tôi về hình thức bạn muốn mã VB trả lại kết hợp tạo ra, nhưng để đơn giản, hãy giả sử danh sách danh sách. VB cho phép đệ quy, và một giải pháp đệ quy đơn giản nhất. Làm kết hợp thay vì hoán vị có thể thu được dễ dàng, bằng cách đơn giản tôn trọng thứ tự của danh sách đầu vào.
Vì vậy, sự kết hợp các mặt hàng K ra khỏi một L danh sách đó là N mục dài là:
- none, nếu K> N
- the whole list L, nếu K == N
- nếu K < N, thì sự kết hợp của hai chùm: những thứ chứa mục đầu tiên của L và bất kỳ kết hợp nào của K-1 của các mặt hàng N-1 khác; cộng với, sự kết hợp của K của các mặt hàng N-1 khác.
Trong mã giả (sử dụng ví dụ .size để cung cấp độ dài của danh sách, [] làm danh sách trống, hãy thêm mục vào danh sách, .head để nhận mục đầu tiên của danh sách, .tail để nhận danh sách các mục "tất cả trừ mục đầu tiên" của L):
function combinations(K, L):
if K > L.size: return []
else if K == L.size:
result = []
result.append L
return result
else:
result = []
for each sublist in combinations(K-1, L.tail):
subresult = []
subresult.append L.head
for each item in sublist:
subresult.append item
result.append subresult
for each sublist in combinations(K, L.tail):
result.append sublist
return result
Mã giả này có thể súc tích hơn nếu bạn cho rằng cú pháp thao tác danh sách linh hoạt hơn. Ví dụ, trong Python ("giả thực thi") sử dụng "cắt" và "danh sách hiểu" cú pháp:
def combinations(K, L):
if K > len(L): return []
elif K == len(L): return [L]
else: return [L[:1] + s for s in combinations(K-1, L[1:])
] + combinations(K, L[1:])
Cho dù bạn cần một cách chi tiết xây dựng danh mục do .append lặp đi lặp lại, hoặc ngắn gọn có thể xây dựng chúng bằng cách ký hiệu hiểu danh sách , là một chi tiết cú pháp (như là sự lựa chọn đầu và đuôi vs danh sách cắt ký hiệu để có được mục đầu tiên của danh sách so với phần còn lại): mã giả nhằm thể hiện chính xác cùng một ý tưởng (cũng là ý tưởng tương tự được thể hiện trong Tiếng Anh trong danh sách được đánh số trước đó). Bạn có thể thực hiện ý tưởng bằng bất kỳ ngôn ngữ nào có khả năng đệ quy (và, tất nhiên, một số hoạt động danh sách tối thiểu!).
Nguồn
2009-07-18 21:02:03