一道遞歸的好題

題目描述:

設整型數組A中有n個元素,輸出從這n個數中取出的k個數的所有組合(k<=n)。例如:若A中存放的數是1,2,3,4,5,k爲3,則輸出結果應爲:123,124,125,134,135,145,234,235,245,345

題目分析:

從數組A中選出K(本題中k=3)個元素,爲了避免重複和泄漏,可分別求出包括A[0]和不包括A[0]的所有組合。即包括A[0]時,求出A[1...n]中取出k-1個數的所有組合,不包括A[0]時,求出A[1...n]中取出k個元素的所有組合。將這兩種情況合到一起,就是最終的結果。

#include <stdio.h>
int b[3];
int a[]={1,2,3,4,5};
void comb(int i,int j,int k)
{
	if(k==0)
	{
		for(int m=0;m<3;m++)
			printf("%d",b[m]);
		printf("\n");
	}
	else if(i+k-1<5)
	{
		b[j++]=a[i];
		
	
		comb(i+1,j,k-1);//在裏面了
		comb(i+1,j-1,k);//不在裏面了	
	}
}

int main()
{
	comb(0,0,3);
	return 0;
}

輸出結果:



大家可以思考,若要逆向輸出,即本題輸出543,542,541,532,531,521,432,431,421,321。算法該做怎樣的調整呢?


---------------我是華麗的分割線-----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>
int b[3];
int a[]={1,2,3,4,5};
void comb(int i,int j,int k)
{
	if(k==0)
	{
		for(int m=0;m<3;m++)
			printf("%d",b[m]);
		printf("\n");
	}
	else if(i-k+1>=0)
	{
		b[j++]=a[i];
		
	
		comb(i-1,j,k-1);//在裏面了
		comb(i-1,j-1,k);//不在裏面了	
	}

		

}

int main()
{
	comb(4,0,3);
	return 0;
}


輸出結果:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章