Забудьте о реализации («быть сделано со строками», очевидно, является реализацией проблемы!) - подумайте об алгоритме , ради Пита ... так же, как и в твой самый первый TAG, чувак!
То, что вы ищете, это все комбинации из K элементов из набора N (индексы от 0 до N-1 из установленных битов). Это, очевидно, проще всего выразить рекурсивно, например, псевдокод:
combinations(K, setN):
if k > length(setN): return "no combinations possible"
if k == 0: return "empty combination"
# combinations INcluding the first item:
return (first-item-of setN) combined combinations(K-1, all-but-first-of setN)
union combinations(K-1, all-but-first-of setN)
То есть, первый элемент либо присутствует, либо отсутствует: если он присутствует, у вас остается К-1 (из хвоста, или все, кроме елей), если отсутствует, все еще остается К, чтобы идти.
Функциональные языки сопоставления с образцом, такие как SML или Haskell, могут быть наилучшими для выражения этого псевдокода (процедурные, такие как мой Python большой любви, могут на самом деле замаскировать проблему слишком глубоко, включая слишком богатую функциональность, такую как itertools.combinations
, которая делает всю тяжелую работу за вас и поэтому скрывает это от вас!).
Что вам больше всего подходит для этой цели - Scheme, SML, Haskell, ...? Я буду рад перевести указанный выше псевдокод для вас. Конечно, я могу делать это и на таких языках, как Python, но поскольку дело в том, чтобы вы поняли механику этого домашнего задания, я не буду использовать слишком богатую функциональность, такую как itertools.combinations
, а скорее рекурсию ( и устранение рекурсии, если необходимо) для более очевидных примитивов (таких как голова, хвост и конкатенация). Но, пожалуйста, ДАЙТЕ нам знать, с каким псевдокодоподобным языком вы больше всего знакомы! (Вы ПОНИМАЕТЕ, что проблема, о которой вы говорите, идентична: «выведите все комбинации из K предметов или диапазона (N)», верно?).