Рекурсивная функция двоичных строк

#python #binary

#python #двоичный

Вопрос:

Как написать рекурсивную функцию, которая генерирует список двоичных файлов длиной n с указанным количеством единиц? Вот код, который рекурсивно генерирует список двоичных файлов; без указанного количества единиц:

 def generateAllBinaryStrings(n, arr, i):  

    if i == n: 
        printTheArray(arr, n)  
        return

    # First assign "0" at ith position  
    # and try for all other permutations  
    # for remaining positions  
    arr[i] = 0
    generateAllBinaryStrings(n, arr, i   1)  

    # And then assign "1" at ith position  
    # and try for all other permutations  
    # for remaining positions  
    arr[i] = 1
    generateAllBinaryStrings(n, arr, i   1)  
  

Взято из geeksforgeeks

Комментарии:

1. Эта функция уже рекурсивна. В чем именно проблема?

2. Проверьте этот вопрос: math.stackexchange.com/questions/2847310 /…

3. Вы проверили принятый ответ? Он определяет рекурсивную функцию.

4. Подсказка: передайте также число 1, оставшееся в вызове функции, и отключитесь, если осталось больше 1, чем цифр.

5. Спасибо DroidX86 и Кену Шириффу!

Ответ №1:

Вы могли бы сделать это так:

 def binaryStrings(n, ones):  
    if n < ones: # impossible
        return []
    if n == ones:
        return ["1" * ones]
    if ones == 0:
        return ["0" * n]
    a = binaryStrings(n-1, ones)
    b = binaryStrings(n-1, ones-1)
    return ["0" s for s in a]   ["1" s for s in b]
  

Пример вызова для получения всех 6-значных двоичных чисел, которые имеют ровно 4 1-разрядных:

 print(binaryStrings(6,4))
  

Комментарии:

1. Спасибо! Именно то, что я хотел

Ответ №2:

Вы должны сгенерировать все возможные последовательности с добавлением 0 или 1 в каждой позиции. Общее количество возможных последовательностей = 2 ^ МАКС. Следите за количеством единиц в текущей последовательности до сих пор, чтобы прервать.

 # Generate all binary numbers with exactly "n" 1s
# Max digits in the binary number = MAX

def binary(n):
    MAX = 5
    all_solutions = []
    def solve(current, remaining_ones):
        if len(current) > MAX:
            return
        if remaining_ones == 0:
            all_solutions.append(current "0"*(MAX-len(current)))
            return

        solve(current "1", remaining_ones - 1)
        solve(current "0", remaining_ones)

    solve("", n)
    return all_solutions

 print(binary(2))
 # ['11000', '10100', '10010', '10001', '01100', '01010', '01001', '00110', '00101', '00011']