1. 程式人生 > >c/c++遞迴實現排列Permutations

c/c++遞迴實現排列Permutations

利用遞迴實現排列,比如實現字元陣列list[]=“abc”的排列,方法的思想是,a開頭,後面bc所有排列,然後b開頭後面ac所有排列,然後c開頭後面ba所有排列。

以下是例子程式碼,這裡涉及到了遞迴呼叫裡面含有for迴圈的問題。遞迴呼叫裡含有for迴圈,也就是在for迴圈裡面進行了遞迴呼叫。這個時候可以理解成多層遞迴,例如下面例子中,第一層遞迴時開始執行第一次for迴圈,執行for迴圈時候開始了第二層遞迴,第二層遞迴裡開始執行第二層遞迴的for迴圈,第二層遞迴裡的for迴圈開始執行第三層遞迴,當第三層遞迴執行時發現k=j也就是滿足遞迴結束條件,則此時第三層遞迴結束,開始執行第二層遞迴的第二次for迴圈......當第二層遞迴結束後,開始執行第一層遞迴的第二次迴圈................

#include <stdio.h>
#define SWAP(a,b,t) ((t)=(a),(a)=(b),(b)=(t))//巨集函式
void perm(char *list,int k,int j);
void main()
{
	char list[]="abc";
	perm(list,0,2);//0表示從a開始,2表示到c結束
}

void perm(char *list,int k,int j)//k,j為開始結束位置
{
	char temp;
	int i;
	if(k==j)
	{
		printf("%s\n",list);
	}
	else
	{
		for(i=k;i<=j;i++)
		{
			SWAP(list[i],list[k],temp);//換到開頭
			perm(list,k+1,j);//遞迴呼叫
			/*
			遞迴呼叫,只有k變,可以理解成先把a放在開頭,把bc全排列,bc全排列的時候又要把b放在bc的開頭,把c全排列,以此類推。
			當a在開頭時所有全排列完畢,也就是k=j時第三層遞迴結束進行第一層遞迴的第二次迴圈,也就是進行下一次for迴圈,把b放在開頭,全排列ac.....如此進行
			*/
			SWAP(list[i],list[k],temp);//恢復位置
		}
	}
}