字符串遞歸全排列
abc?
acb?
bac?
bca?
cba?
cab?
1.?? 我們會發(fā)現(xiàn)每個字母都會有首字母開頭的時候钢拧,所以可以用一個for循環(huán)使每個字母與a互換打頭(begin)酬土,如:以abc為原型,b與a互換得bac(然后進行下列步驟,ac循環(huán)進行打頭喻旷,a打頭得bac诺苹,c打頭得bca),c與a互換得到cba(cab)婶博。
2.?? 然后再對剩下的字母(此時還剩N-1個字母)瓮具,進行打頭,如:abc,acb凡人。
3.?? 繼續(xù)循環(huán)n-2….n-3…..n-(n-2)….n-(n-1)即還剩一個時(最后一個end)名党,如:abc,acb
4.??? 此時begin=end輸出字符串for循環(huán)輸出
5.??? 遞歸當(dāng)剩2個元素時[n-(n-2)]時,進行兩個元素的排列挠轴,也是兩個元素輪流打頭传睹,回到步驟3和步驟4;
遞歸當(dāng)剩3個元素時[n-(n-30)時岸晦,進行三個元素的排列欧啤,三個元素輪流打頭,定下一個后启上,進行兩個元素大頭邢隧,然后只剩下一個元素,begin=end冈在,輸出府框;
。。迫靖。院峡。循環(huán)遞歸
綜上得到代碼:
但是這一串代碼的到的結(jié)果是abc? acb? cab?cba?abc? acb
為什么呢?
原來是當(dāng)數(shù)據(jù)調(diào)換成acb時系宜,地址改變里面的數(shù)據(jù)改變就保存了照激,再進行第二個元素與第一個元素交換時,即acb ----cab盹牧;
這個問題的解決方法就是俩垃,在進行交換完成之后,再把它交換會原來的樣子即