來到遞迴的最後一題了!也是這個系列的最後一題><
題目比較需要仔細思考或是畫出來比較好懂!
我們要列出字串的所有排列~
我先補充一下等等會用到的模組!
typing模組:Python的typing模組透過型別註釋(type annotations)讓開發協作者可以更加了解某個變數的型別,對於複雜的系統特別有用。
List類:List是typing模組中的一個類型提示,用來表示一個元素可以是任意類型的列表(或稱為陣列)
例如,List[int] 表示一個包含整數的列表,List[str] 表示一個包含字符串的列表。
來看題目吧!><
列出字串的所有排列
第一行引入的就是前面提到的!提高代碼的可讀性和可維護性,並幫助開發工具進行錯誤檢查
接下來定義一個函式叫做permutations,他的參數只有s,並回傳一個列表,裡面包含所有s的排列
這行看起來應該很陌生!來解釋一下~
-> 是用來標示函式的回傳類型的語法
而def permutations(s: str) -> List[str]:的意思就是參數s要是字串類型
然後-> List[str] 指定函式要回傳一個列表,而裡面的元素是字串
來講函式內的程式碼!
第一個if len(s) <= 1:是基本情況,當字串的長度等於或小於1的時候就直接回傳[s]
因為這代表它是空字串或是只有一個字符!就只有一個排列而已~
這時候再生成一個list叫做result,用來儲存所有的排列
再來外層的for迴圈它可以一個一個跑字串中的每一個字符,範圍是len(s),也就是有多少字符,for迴圈就跑幾次
迴圈中的char=s[i]就是要取出當前第i個字符
remaining=s[:i]+s[i+1:]比較複雜一點,意思是取得剩下的字符,去掉當前字符後的部分
例如s是"abc",當i=1、char是'b',所以remaining是'ac'
內層的for迴圈是對於每一個剩下字符的排列,將字符char加在前面
然後將這個新的排列加到result這個列表中
最後回傳result,也就是所有排列組合的列表!
按照程式碼這樣跑下來,我參數給abc,就能輸出abc的所有不同排列!
這題的函式用到了遞迴,將問題分解成更小的子問題,再透過生成子字串的排列組合來解決整個問題!
這個系列的題目就到這裡囉><
明天會統整一下這個月講了什麼以及我的感想!