当涉及到其他循环(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)))
答案 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的排列。