【问题标题】:Converting an iterative solution to a recursive solution将迭代解决方案转换为递归解决方案
【发布时间】:2020-06-07 15:23:16
【问题描述】:

我目前正在解决一个问题,该问题需要我设计一个函数,该函数接受一串“0”、“1”和“X”作为参数,并返回一个生成器,该生成器产生 X 变为 1 的不同组合和0的

ie: 传递 '0XX1', 将返回产生的生成器-> 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()

【问题讨论】:

  • 为什么需要递归?
  • 这是一个递归问题。我首先迭代地解决了它,因为我认为我能够更容易地识别递归解决方案(我错了——现在我被难住了!)。
  • 可以使用模块函数吗?
  • 我宁愿不这样做,这样我才能真正开始从概念上和实践上掌握这类问题。

标签: python recursion iteration generator


【解决方案1】:

递归函数通常更容易推理且更短。通常,您将从基本案例开始。在这里你可以想象你的函数应该用一个空字符串产生什么。应该是''。

接下来,如果您的第一个字符不是X,您只需生成第一个字符加上递归调用其余字符的结果。如果它是和X,那么你会同时产生1+recursive call 和 0+recursive call。比如:

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']

【讨论】:

  • 哇,这要短得多!感谢您的协助。现在对我来说更有意义了
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 2013-07-22
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多