全排列的遞迴實現方法

2021-09-21 23:59:53 字數 1476 閱讀 8820

對於全排列,比如有5個字元abcde,則有5!=120種方法.

首先分析出數學遞迴公式,加上對abcde這個字串中的字元做全排列。

那麼,假設abcde是乙個輸入引數,輸出的值則是乙個全排列集合。我們就可以有:

f(abcde)=a+f(bcde)//注意,此處的+號不是簡單的加號,而是另乙個運算規則,下面會說到。

f(bcde)=b+f(cde)

f(cde)=c+f(de)

f(de)=

以上就是運算的遞迴函式,其中f()函式返回的是一集合,而這裡的加號,筆者把它的行為定義為,把乙個字元按順序的插入到乙個字串中。

舉個例子:

a+bcde,行為就是把a插在每個位置之間,得到的是如下的乙個集合:

abcde,bacde,bcade,bcdae,bcdea

上面是a對單個項進行+操作。

a+f(bcde)則意思是a對乙個集合f(bcde)做操作,意味著a對集合中每乙個象做+操作。

如上的例子,a對bcde做操作會生成5個項的集合,那麼事實上bcde的全排列,根據中學的數學計算推斷有4!就是24,f(bcde)有24個項。所以a+f(bcde)意味著a對於這24個項中的每乙個項做操作,每個操作生成5個項的,因此總的就會生成5*24=120個項的集合。說到這,你就應該理解+操作的定義了。

事實上,寫成+操作只是為了看起來方便,也可以換種表的方式,比如叫做c操作,那麼,上述遞迴的式子也可以寫成,

f(abcde)=c(a,f(bcde) )

f(bcde)=c(b,f(cde))

f(cde)=c(c,f(de))

f(de)=

這兩種表達的數學含義都是一樣的。

有了數學意義的表示式,就可以寫**了

c#實現。

using

system;   

using

system.collections.generic;   

using

system.linq;   

using

system.text;  

namespace

quanpailie   

}  static

list<

string

> f(

string

instring)

//遞迴方法的實現 

else

}  static

list<

string

> combine(

string

c, list<

string

> lists)

//此處就是上述所說的+操作的實現方法,或者說c操作的實現方法,返回的是乙個集合 

}   

return

output;   

}   

}   

}  

python遞迴全排列實現方法

排列 從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列 全排列 當n m時,稱為全排列 比如 集合的全排列為 www.cppcns.com 遞迴思想 取出陣列中第乙個元素放到最後,即a 1 與a n 交換,然後遞迴求a n 1 的全排列 1 如果陣列只有乙個元素n 1,a 則全排列就是 ...

全排列 遞迴方法

與網路上大多數方法相比,該方法可以處理 1 1 1 重複生成的問題 c採用set include include include using namespace std int n 0 vector con set res void resprint void swap int a,int b vo...

遞迴實現全排列

生成全排列的最簡單的遞迴方法的思想 1.可以把幾個數字分成前半部和最後一位。對於0123這四個數來說,最後一位 紅色字型 所出現的情況只有以下四類 先不管前三個數的排列組合情況 3 2 1 0這樣我們就把四個數字的排列問題,變成了3個 對於上述的每一行來說 2.終結條件是1個數字的排列就是其本身。直...