[英]How does the inner loop append on each iteration?
def per1(seq):
if not seq:
return [seq]
else:
res=[]
for i in range(len(seq)):
rest=seq[:i]+seq[i+1:]
for x in per1(rest):
res.append(seq[i:i+1]+x)
return res
print(per1('abc'))
該功能是打印序列的排列列表,但我不確定內部for循環的工作方式。 我試圖使用trace()
來查看控件如何在循環中移動,但是我無法弄清楚第二次循環是如何工作的。 第一次, ' rest '
值是'bc','c'
。
每次通過for i
循環, rest
字符都會設置為除去一個字符的輸入字符串。 第一次它具有第一個字符刪除,它具有第二字符等除去第二時間seq[:i]
是前每一個字符i
,和seq[i+1:]
是后每個字符i
。
然后,它在rest
遞歸調用自己。 這將返回該較短字符串的所有排列。 因此,當rest
是"bc"
, "bc"
返回["bc", "cb"]
。 for x
循環遍歷此列表,並將每個列表連接到seq[i:i+1]
(這是創建rest
時刪除的字符),並將其附加到res
。
因此,主回路組的第一次迭代rest
,以"bc"
,然后追加"abc"
和"acb"
到res
。
第二次迭代執行相同的操作, rest
設置為"ac"
,而seq[i:i+1]
為缺少的字符"b"
,因此將"bac"
和"bca"
追加到res
。
第三次迭代類似, rest
設置為"ab"
,因此將"cab"
和"cba"
追加到res
。
特殊情況是遞歸的基本情況。 如果輸入字符串為空,我們只返回帶有該空字符串的列表-一個空字符串具有瑣碎的排列。 當調用者執行它的for x
循環時,它將簡單地將此空字符串連接到當前字母上。 需要這種情況以防止無限遞歸。 您還可以將len(seq) == 1
作為基本情況,因為單個字母的排列也是微不足道的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.