一個字串abc有多少種組合呢?

有學過排列組合的人都知道有6種,分別為

abc

acb

bac

bca

cab

cba

 

現在,請你寫出一支程式,可以輸入一組字串,並輸出該字串所有排列情形

 

方法有2種

第1種是利用遞迴(Recursive)

第2種是利用for迴圈

 

首先,先來看第1種情形

1.png

從圖中我們可以看出

要排列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一次

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()