递归生成字符串的所有排列-解释吗?

时间:2019-04-15 18:29:06

标签: python recursion

当涉及到其他循环(for循环)时,我真的很难理解递归。我了解递归技术对阶乘/斐波那契的工作方式,但努力了解每个for循环何时运行以及变量在任何时候的值应该是什么。我尝试使用调试方法运行此代码以逐步显示该代码,但我不理解该程序为何如此运行。

假设我在函数中输入了字符串“ abc”。

我可以看到我将在最外层的for循环中运行,直到变量元素中剩下单个字符为止。然后,我在最后一个字符(“ c”)上运行内部for循环。我不明白的是,为什么烫发的价值突然变成“ bc” ...我想,一经了解,我也许就能解决以下情况,但这使我感到困惑。

如果您知道一个很好的网站或视频可以逐行解释此EXACT代码,那就太好了。我想了解这种方法,而不是尝试其他递归解决方案,因为我已经关注了几天。

谢谢

Python代码:

def all_perms(elements):
    if len(elements) <=1:
        yield elements
    else:
        for perm in all_perms(elements[1:]):
            for i in range(len(elements)):
                yield perm[:i] + elements[0:1] + perm[i:]


word = input("Word to scramble: ").lower()
print (list(all_perms(word)))

2 个答案:

答案 0 :(得分:0)

外循环

for perm in all_perms(elements[1:]):

从第二个字符开始获取子字符串的所有排列。内循环

for i in range(len(elements)):

然后针对每个排列运行。它将原始字符串的第一个字符插入字符串的每个位置,并产生该字符。

如果从"abc"开始,它将调用all_perms("bc"),它将返回["bc", "cb"](由于all_perms是生成器,因此它实际上不是列表,但这是list(all_perms("bc"))是什么)。这就是"bc"的来源。

因此,在第一次迭代中,perms将为"bc",并且内部循环将在每个位置插入"a",生成"abc""bac", “ bca”`。

在第二次迭代中,perms将是"cb",因此内部循环的结果将是"acb""cab""cba"

答案 1 :(得分:0)

此过程基于列表其余部分的排列中每个位置的第一个元素的插入:

例如,使用ABCD:

  • A插入其余(BCD)的每个排列的位置0、1,2和3。

  • 因此,对于BCD的每个排列xxx,该函数将 返回:

     Axxx, xAxx, xxAx and xxxA
    

通过递归获得BCD的排列。