簡體   English   中英

內循環如何在每次迭代中附加?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM