排列組合問題

2021-10-03 03:01:40 字數 1024 閱讀 3069

若有一串字母abc,進行全排列,有六種方法,3的階層,321,為什麼是這樣呢,我們根據**看思路(這之間會涉及遞迴,回溯):

將abc看成陣列,a[0]=a,a[1]=b,a[2]=c;(下文中用a0代替a,a1代替b,a2代替c),排列的過程就是交換位置的過程:

1、先對a進行交換(即k=0時):

a0和a0自己交換:abc

a0和a1交換:bac(此步還未執行,只有上一步遞迴交換完後才會自行此步)

a0和a2交換:cba(此步還未執行,只有上一步遞迴交換完後才會自行此步)

從下圖中的**我們看出,在a0和a0 交換之後,k+1進入遞迴,同理在。

2、對abc(此abc 是a0和a0交換後的abc)中的第二個位置進行交換:

a1和a1 進行交換:abc

a1和a2 進行交換:acb(此步還未執行只有上一步遞迴交換完後才會執行此步)

在a1和a1交換之後,k+1進入了遞迴

3、對abc(此abc 是a1和a1交換後的abc)中的第三個位置進行交換:

a2和a2 進行交換:abc

此時abc即是最總排列的結果之一輸出,同樣結束遞迴後

會回到第2步 回溯完後,i+1交換形成acb,在進入遞迴,進入第3步,此時acb是最總排列的結果之一輸出,再次結束遞迴回到第2步 ,回溯,回到第1步,此時進行回溯(交換恢復成原來佇列的模樣),然後i+1,交換形成bac。

為何要進行回溯?

因為,遞迴完後3個字母的位置發生了變化,而我們在每次遞迴後進行交換位置都是在原位置順序上進行交換,所以要進行交換回溯。

總的來說,由abc 引出:abc,bac,cba,

由abc(a0和a0交換後)引出:abc,acb

由bac引出:bac,bca

由cba引出:cba,cab

排列組合問題

基本的排列組合問題,就是高中數學的內容,怎麼用程式語言輸出所有排列呢?我們手寫的過程,它應該是乙個遞迴的過程,而不適合用for wihle迴圈。如果資料結構學的紮實,可以發現這是乙個樹結構,遍歷所有的葉子節點就能夠得到全排列。說到遞迴,應該向大家隆重介紹一下數學歸納法的思想,應為都有乙個問題規模n。...

排列組合問題

這資料寫個暴力都拿不了30分 t t。c n,i c n,i c n,i c n,n i 結合現實意義,在n個裡面選 i 個,再在n個裡面選n i個的方案數。就等價於在前n個中選 i 個,在後n各種選n i個。而且i 0 n 在2 n各種選n個。那麼 c 2 n,n 答案要對1000000007取模...

排列組合問題

部落格 見problem28 問題1 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。思路 這是個遞迴求解的問題。遞迴演算法有四個特性 1 必須有可達到的終止條件,否則程式將陷入死迴圈 2 子...