排列演算法 遞迴

2022-08-28 10:39:09 字數 2080 閱讀 2638

int combination( int n, int k)

c(n,k) = c(n-1,k) + c(n-1,k-1);
對組合數c(n,k) (n>=k):將n,k分別化為二進位制,若某二進位制位對應的n為0,而k為1 ,則c(n,k)為偶數;否則為奇數。

組合數的奇偶性判定方法為:

結論:

對於c(n,k),若n&k == k 則c(n,k)為奇數,否則為偶數。

證明:

利用數學歸納法:

由c(n,k) = c(n-1,k) + c(n-1,k-1);

對應於楊輝三角:

1 1 1

1 2 1

1 3 3 1

1 4 6 4 1

可以驗證前面幾層及k = 0時滿足結論,下面證明在c(n-1,k)和c(n-1,k-1) (k > 0) 滿足結論的情況下,

c(n,k)滿足結論。

1).假設c(n-1,k)和c(n-1,k-1)為奇數:

則有:(n-1)&k == k;

(n-1)&(k-1) == k-1;

由於k和k-1的最後一位(在這裡的位指的是二進位制的位,下同)必然是不同的,所以n-1的最後一位必然是1

現假設n&k == k。

則同樣因為n-1和n的最後一位不同推出k的最後一位是1。

因為n-1的最後一位是1,則n的最後一位是0,所以n&k != k,與假設矛盾。

所以得n&k != k。

2).假設c(n-1,k)和c(n-1,k-1)為偶數:

則有:(n-1)&k != k;

(n-1)&(k-1) != k-1;

現假設n&k == k.

則對於k最後一位為1的情況:

此時n最後一位也為1,所以有(n-1)&(k-1) == k-1,與假設矛盾。

而對於k最後一位為0的情況:

則k的末尾必有一部分形如:10; 代表任意個0。

相應的,n對應的部分為: 1*; *代表0或1。

而若n對應的*中只要有乙個為1,則(n-1)&k == k成立,所以n對應部分也應該是10。

則相應的,k-1和n-1的末尾部分均為01,所以(n-1)&(k-1) == k-1 成立,與假設矛盾。

所以得n&k != k。

由1)和2)得出當c(n,k)是偶數時,n&k != k。

3).假設c(n-1,k)為奇數而c(n-1,k-1)為偶數:

則有:(n-1)&k == k;

(n-1)&(k-1) != k-1;

顯然,k的最後一位只能是0,否則由(n-1)&k == k即可推出(n-1)&(k-1) == k-1。

所以k的末尾必有一部分形如:10;

相應的,n-1的對應部分為: 1*;

相應的,k-1的對應部分為: 01;

則若要使得(n-1)&(k-1) != k-1 則要求n-1對應的*中至少有乙個是0.

所以n的對應部分也就為 : 1*; (不會因為進製變1為0)

所以 n&k = k。

4).假設c(n-1,k)為偶數而c(n-1,k-1)為奇數:

則有:(n-1)&k != k;

(n-1)&(k-1) == k-1;

分兩種情況:

當k-1的最後一位為0時:

則k-1的末尾必有一部分形如: 10;

相應的,k的對應部分為 : 11;

相應的,n-1的對應部分為 : 10; (若為11,則(n-1)&k == k)

相應的,n的對應部分為 : 11;

所以n&k = k。

當k-1的最後一位為1時:

則k-1的末尾必有一部分形如: 01; (前面的0可以是附加上去的)

相應的,k的對應部分為 : 10;

相應的,n-1的對應部分為 : 01; (若為11,則(n-1)&k == k)

相應的,n的對應部分為 : 10;

所以n&k = k。

由3),4)得出當c(n,k)為奇數時,n&k = k。

綜上,結論得證!

全排列遞迴演算法

全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再看後三個數3,4,5。它...

全排列(遞迴演算法)

一 全排列演算法 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。公式 全排列數f n n 定義0 1 演算法 遞迴演算法 網路上偷了乙個圖 全排列 順便複習乙個數學公式 排列的定義 從n個不同元素中,任取...

全排列遞迴演算法

對於乙個長為 n 的陣列,它的全排列一共有 n!種可能,演算法複雜度最小為o n!如果還需要列印出結果,那麼演算法複雜度為 o n n!演算法設計的思路是,對於第一位給定乙個值,剩下的 n 1 位進行全排列,然後通過乙個迴圈遍歷第一位所有可能的值,這裡我們是通過交換來改變第一位的值,對於 n 1 位...