一個字串abc有多少種組合呢?
有學過排列組合的人都知道有6種,分別為
abc
acb
bac
bca
cab
cba
現在,請你寫出一支程式,可以輸入一組字串,並輸出該字串所有排列情形
方法有2種
第1種是利用遞迴(Recursive)
第2種是利用for迴圈
首先,先來看第1種情形
從圖中我們可以看出
要排列abc,可分成3個階段
第1階段: 變換第一個字元
第2階段: 固定第一個字元,變換第二個字元
第3階段: 固定第一、二個字元,變換第三個字元
並在第3階段時印出字串
每次遞迴都是往下一階段移動,return時則是往上一階層移動
故移動順序為: 1->2->3->2->3->2->1->2.....
此外,perm(abc, i, j) 表示變動範圍由i至j,且變動字元為第i項, 所以當 i = j 時(也就是第3階段),需要印出字串
最後要注意的是,SWAP(char *) 又或是 SWAP( list[] ) 都是傳位址過去,所以return時必須要在SWAP一次,否則順序會出錯
接著是第2種情形 (利用for loop)
在遞迴時我們發現,要return回第1階層必須先將第2階層及第3階層都做完
此特性跟for迴圈並無二樣
所以我們得知,每一個for迴圈其實就是在固定一個字元
因此,n個字元的字串需要n-1層的for迴圈
以abc為來說,就需要2層for迴圈
此外,遞迴時是在最後一階段print
想當然而,for迴圈是在最內層print
最後,由於順序問題,每跳出一個for迴圈之前,必須要在swap一次
全站熱搜
留言列表