Какие существуют двухбитные последовательности и сколько их всего
Что проверяют
Сам ответ тривиален: 00, 01, 10, 11, всего четыре. Проверяют, видите ли вы за этим правило 2^n и можете ли сгенерировать все последовательности длины n кодом. Следующий вопрос обычно такой: «а для n = 20» или «переберите все подмножества множества».
Как отвечать
Сначала объяснение: каждый бит независимо принимает два значения, порядок важен, значит по правилу произведения выходит 2 · 2 = 4, а для n бит 2^n. Это размещения с повторением, а не сочетания.
Дальше код, лучше сразу несколько способов:
- через
itertools.product:[''.join(p) for p in product('01', repeat=2)]даёт['00', '01', '10', '11']в лексикографическом порядке; - через числа: последовательности длины n это двоичная запись чисел из
range(2 ** n), то есть[format(i, f'0{n}b') for i in range(2 ** n)]. Короче и сразу показывает, что вы мыслите битами; - рекурсия или backtracking: добавить к префиксу 0, затем 1, пока длина не станет n. Пригодится, если потом попросят отсечь варианты, например без двух единиц подряд.
Хорошо упомянуть применение. Число из range(2 ** n) как битовая маска описывает подмножество: бит i включён, значит элемент i взят. Проверка mask >> i & 1, так перебирают подмножества в задачах на рюкзак и в динамике по маскам. Если спросят про порядок, где соседние коды отличаются ровно одним битом, это код Грея: i ^ (i >> 1).
Про сложность: полный вывод занимает O(n · 2^n), и при n около 30 список строк уже не поместится в память. Для больших n возвращают генератор, а не список.
Где спотыкаются
Используют bin(i): он возвращает '0b1' без ведущих нулей, и 01 превращается в 1. Нужен format с шириной или zfill.
Путают с сочетаниями и отвечают «три», считая 01 и 10 одним и тем же. В последовательности порядок важен.
Строят список через product для n = 30 и роняют процесс по памяти. Для перебора хватает генератора или цикла по range, материализовать всё сразу не нужно.