将迭代解决方案转换为递归解决方案

时间:2020-02-24 01:11:47

标签: python recursion iteration generator

我当前正在处理一个问题,该问题要求我设计一个函数,该函数将字符串“ 0”,“ 1”和“ X”作为参数并返回一个生成器,该生成器将X的不同组合转换为1和0的

ie:传递'0XX1',将返回一个产生yield->的生成器 0001, 0101, 0011, 0111,

我已经迭代地解决了这个问题,但是需要能够递归地解决它。解决此类问题的最佳方法是什么?在这样一个复杂的问题中(嗯,对我来说很复杂!),我该如何确定基本情况和递归情况?

下面是我的迭代解决方案:

from typing import Generator
def binary_strings(string: str) -> Generator[str, None, None]:



    listOfIndices = []
    starterString = ''
    for index, char in enumerate(string):
    if char == 'X':
        starterString = starterString + '0'
        listOfIndices.append(index)

    else:
        starterString = starterString + char

    def stringGenerator(): #generates the different combos
    baseString = starterString
    moddedString = ''
    n = len(listOfIndices)
    counter = 1

    for i, character in enumerate(
            starterString):
        if i == 0:
            yield starterString
        else:
            break

    while counter <= n:

        for i, chara in enumerate(baseString):
            if i in listOfIndices:
                moddedString = baseString[:i] + '1' + baseString[i + 1:]
                yield moddedString
                counter += 1
                if counter > n and n >= 1:
                    counter = 1
                    n -= 1
                    baseString = moddedString
                    break
                else:
                    continue

return stringGenerator()

2 个答案:

答案 0 :(得分:1)

通常情况下,递归函数更容易推理和缩短。通常,您将从一个基本案例开始。在这里,您可以想象您的函数使用空字符串会产生什么结果。可能是''

如果您的第一个字符不是X,则只产生第一个字符,然后递归调用其余字符。如果X,那么您会同时产生1 +递归调用 0 +递归调用。像这样:

def combos(s):
    if len(s) == 0:
        yield  ''
        return 

    head, *tail = s
    for combo in combos(tail):
        if head == 'X':
            yield '1'+ combo
            yield '0'+ combo
        else:
            yield head + combo

s = '0XX1'
list(combos(s))

#['0111', '0011', '0101', '0001']

答案 1 :(得分:0)

忽略(平凡的)基本情况(即没有X要替换的情况),binary_strings(s) = binary_strings(s') + binary_strings(s''),其中s's,第一个X用0替换,s''s,第一个X替换为1。