遞迴求全排列

2021-06-18 22:51:56 字數 725 閱讀 7072

取出陣列中第乙個元素放到最後,即a[1]與a[n]交換,然後遞迴求a[n-1]的全排列

1)如果陣列只有乙個元素n=1,a= 則全排列就是

2)如果陣列有兩個元素n=2,a= 則全排列是

--a[1]與a[2]交換。交換後求a[2-1]=的全排列,歸結到1)

--a[2]與a[2]交換。交換後求a[2-1]=的全排列,歸結到1)

3)如果陣列有三個元素n=3,a= 則全排列是

,1}--a[1]與a[3]交換。後求a[3-1]=的全排列,歸結到2)

,2)--a[2]與a[3]交換。後求a[3-1]=的全排列,歸結到2)

,3)--a[3]與a[3]交換。後求a[3-1]=的全排列,歸結到2)

...以此類推。

馬上用c**實現,成功!

#include

int g_count = 1;

int g_n = 0;

void print_result(int *a)

printf("\n");

return;

}#define swap(a, b)\

void p(int *a, int size)

} return;

}void main(void)

; g_n = sizeof(array) / sizeof(int);

p(array, g_n);

return;

然後可以參考

自寫 求全排列 新演算法 遞迴實現

演算法思想從根本上區別於網 上的諸多方法,思想基於把用來儲存一組數形成的所有序列的二維陣列看成乙個表 每個排列都是豎著放的,看著順眼 而使用遞迴進行了類似於把表從上到下一行一行的填滿,有幾個數就有幾層遞迴 每層有多個遞迴 這次關鍵乙個遞迴函式 只有30左右行 但從構思到寫 到除錯完成,花了將近一天半...

不使用遞迴求全排列和組合數

同學遇到的面試問題,大意是m臺機器放在n個房間,不使用遞迴求列印所有情況 解題思路 情況共計n m種。開始想將所有情況放入陣列,填充好陣列再逐個列印。隨後發現按照填充的思路,不使用大陣列也可以實現。思路是加入m n 3,則27種情況,記i0.i26。0.m個數,0放入i0 0 i1 1 i2 2 i...

庫函式求全排列

上級排列 prev permutation start,end 求的是當前排列的上乙個排列 對於 上乙個 和 下乙個 它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn 1,不存在另外的pm,使得pn字典序 不同排列的先後關係是從左 右逐個比較對應的數字的先後來決定的。例如 對於6個數字的...