關於遞迴解決全排列問題的研究

2021-10-02 12:06:50 字數 2485 閱讀 2087

遞迴是乙個非常重要的解題方法和思路,我們在生活中很多地方都用到了遞迴概念。現有一字串序列,要求我們對其進行全排列,例如「ab」的全排列為「ab」和"ba",編寫程式解決問題。

在數學中全排列問題是乙個非常常見的問題,在概率問題中經常出現,通常全排列都是用大寫字母a來表示。我們在數學中確實經常做到全排列的題,但是,我們很少讓寫出全排列,大部分問題都是讓我們求出對於乙個序列,全排列的個數,有可能確實有讓寫全排列的,但是其階數最大基本上不超過3,因為階數為4時,全排列的個數已經是十位數了,所以我們很少體驗到寫高階全排列的過程,而做的基本上都是算排列的個數。現在我們舉個例子:求出序列abcd的全排列個數。非常簡單,答案是24,方法是4*3*2*1 = 24。但是,這個求解個數的方法,其實也是使用了遞迴思想,現在讓我們捋一捋這裡面的關係:「4」代表什麼?"4"代表第一位可以出現的字元的個數,當我們考慮第一位時,所有的四個字元都還沒有動用,因此他們四個均可以出現在第一位;那麼"3"又是什麼呢?它的意思是當第一位確定後,第二位可能出現的字元的個數;同理,「2」是前兩位確定後,第三位可能出現的字元的個數;最後,「1」是前三位確定後,最後一位出現的字元個數。這些數字相乘,就代表了全排列出現的所有可能。注意,這個結果出現的前提是字元中沒有重複元素,如果有的話就要另當別論了。

這裡體現的遞迴思想只要思考一下就可體會出來,首先我們在考慮第一位時,有四種可能,此時我們考慮的是長度為4的序列的開頭元素,而當第一為元素確定以後,我們去考慮第二位的元素,理所當然只有三個,這是因為第一位已經占用了乙個,這是理所當然的。確實這種理解方式不算錯,但是我們也可以通過另乙個角度去看,我們確定第一位後,便不再考慮第一位,將第二位當作乙個長度為三的序列的首位,我們從三個元素中去挑乙個來作為它的首位;而第三位使用同樣的思路去考慮,就是在乙個長度為2的序列中,從兩個元素中去挑乙個作為它的首位。它的遞迴思想就這樣出來了。

簡單來說,就是:階數為四的全排列,我們可以化解成兩個基本問題,乙個問題是從四個之中選出乙個作為它的首位;另乙個問題是,選出來的這個元素後面只要接上乙個三階的全排列,那麼這個元素為首的所有排列就得出來了。因此我們只要不斷變換開頭元素,然後去求去掉這個元素的全排列,即可得到所有的全排列。解決這個問題的方法買就是遞迴,下面我用**來詳細說明。首先是基本思路的概述:

然後是我們得到其中一種排列的過程:

這樣,問題就基本上明了了,遞迴過程其實就是忽略開頭元素,去求解乙個比自己當前階數少一階的序列的全排列,而這個子問題的全排列的解決也是乙個同樣的過程,這樣就完全符合遞迴思想了。我們只要在每乙個程序中,讓當前規模下序列的每乙個元素做一遍開頭,然後進入遞迴呼叫即可解決問題。下面是**:

#include #define g 100

void permute(int start,int end,char list); //排列函式,start為開始位置下標,end為結束為止下標

void move(int a,int b,char list);//位置交換函式,用於讓每個元素做開頭,改變元素在陣列中的位置

int main(void)

void permute(int start,int end,char list)else }

}void move(int a,int b,char list)

輸入及執行結果:

其他測試可自行實驗。

以上問題解決的是序列元素中沒有重複元素時的情況,當序列元素中有重複情況時,需要進行一些修改,下面附上修改後的**,這個**可以解決當序列中有重複元素時的全排列問題。

#include #define g 100

void permute(int start,int end,char list); //排列函式,start為開始位置下標,end為結束為止下標

void move(int a,int b,char list);//位置交換函式,用於讓每個元素做開頭,改變元素在陣列中的位置

int find_no_same(char list,int pre,int start); //用於檢視是否有和自己一樣的

遞迴研究 二 全排列問題

從n個不同的元素中任取m m n 個,按照一定的順序排列起來,叫做從n個元素中取出m個元素的乙個排列,當m n時,所有的排列情況叫做全排列.若求n個元素的全排列,可以先求n 1個元素的全排列,然後針對n 1個全排列的每一種情況t,把第n個元素依次插入到t的n個間隔中.n 1時,為遞迴的終結條件.de...

利用遞迴解決全排列問題

基本思想 以四個數為例,先把第乙個位置的數固定,遞迴地求後三個數的全排列,在求後三位的全排列時,把這三位中的第一位 整個數列中的第二位 固定,以此類推。當只剩最後乙個數要被固定時就可以輸出了。比如0123,先是輸出0123 全固定 然後2取消固定,和3進行交換,交換後一組全排列輸出完畢要交換回來。0...

關於陣列的遞迴全排列問題

進入大學後每天似乎都在努力學習,但是感覺總是學不會什麼東西。昨天在健身房跟同學聊天,提到學了東西之後可以自己寫一些東西來鞏固記憶和理解。今天剛剛接觸到乙個關於陣列遞迴全排列的問題,看了別人寫的相關介紹,自己根據理解也來獻醜一下。我這裡寫的陣列全排列問題主要用的就是遞迴的方法來實現這個陣列的全排列問題...