【问题标题】:How to understand algorithm of generation all the possible symbols sequences using generator function and recursion如何理解使用生成器函数和递归生成所有可能符号序列的算法
【发布时间】:2022-01-01 11:51:08
【问题描述】:

我试图理解下面函数的算法,但没有什么能帮助我理解这个算法,甚至使用这个https://pythontutor.com/visualize.html进行深度调试。我应该注意到我肯定了解迭代器和生成器,但这让我感到困惑。

请解释一下它是如何工作的。

代码:

def permute(seq):
    """
    This function returns all the possible unique mixes of symbols in sequence

    Example with "xyz" string:
        xyz, xzy, zxy, zyx, yxz, yzx

    :param seq: any sequence
    """

    if not seq:
        yield seq
    else:
        for i in range(len(seq)):
            rest = seq[:i] + seq[i + 1:]
            for x in permute(rest):
                yield seq[i:i + 1] + x


string1 = "hard"
print(*(permute(string1)))  # hard hadr hrad hrda hdar hdra ahrd ahdr arhd ardh adhr adrh rhad rhda rahd radh rdha rdah dhar dhra dahr darh drha drah

【问题讨论】:

  • 到目前为止你对它的理解是什么?
  • 我流畅地使用生成器和迭代器。但是通过递归它绞尽脑汁(递归总是如此)。如果你问的是这段代码,我什么也不能告诉你……
  • 如果您甚至难以开始理解,开始查看递归函数的最佳方法之一是从“基本情况”开始并进行处理 - 当permute 是用空字符串调用?当使用长度为 1 的字符串调用它时会发生什么?等等等等

标签: python recursion generator


【解决方案1】:

该函数返回生成器,并在第一个if 语句中检查参数seqFalse 还是None。我将只解释参数长度的第一次迭代,其余的将是相同的。

for i in range(len(seq)):
    rest = seq[:i] + seq[i + 1:]

如果我们使用您的"hard" 示例,i 的可能值是0, 1, 2, 3

在第一种情况下,i 的值为0,变量rest 的值为'' + 'ard' [seq[:0] = '', seq[0+1:] or seq[1:] = 'ard']。

for x in permute(rest):
    yield seq[i:i + 1] + x

在这里,我们发现recursion 正在发生。因此,对于我们的第一种情况 [permute('ard')],x(生成器)的可能值将是 ard adr rad rda dar dra。如果您深入研究,您会注意到每个案例都需要进行四次多次递归。

现在,如果我们看到递归的第一次迭代和输出,我们可以注意到,它是'h' + 'ard'[seq[i:i + 1] 或进一步简化为seq[i:(i+1)],然后是seq[0:1] = 'hard']。至于第二种情况,那就是'h' + 'adr' = 'hadr'

通过进一步分析,可以看到前两次迭代的递归结果如下:

"""The number is the value of i in each recursion"""

 0 # fourth and ending recursion where the string is ''
d 0 # third, 'd'
rd 0 # second, 'rd'
ard 0 # first recursion where second recursion is triggered, seq[0:0+1] is 'h' ('hard')
# You can see a pattern here - ard -> rd -> d

 0
r 1
dr 0
adr 0 # 'hadr'
# ard -> dr -> r

所以,这就是我们的第一个和第二个字符串的获取方式。它会重复,这就是您获得输出的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2015-01-27
    • 2022-11-04
    • 2016-02-16
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多