在qszhoufuge那里看到“一个集合的算法问题”题目如下:
设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合。例如,从集合{1..4}中选取2个元素的所有组合的输出结果为:1 2,1 3,1 4,2 3, 2 4,3 4。
早上在家的时候随手写了一个用循环解决的,因为没环境测试,下午有时间的时候测试发现错了,哈哈。非常抱歉啊。
后来一想,其实这个不难,用递归可以很好解决,于是乎就静下心来思考,其实用递归实现真的不复杂,这次终于一次性通过了,^_^
实现算法如下(经过测试的):
#include <stdio.h>
//显示组合
//nCount:组合的个数
//p:数组指针
inline void p2s(int nCount,int *p)
{
for (int i = 0;i<nCount;++i)
{
printf("/t%d",*(p + i));
}
printf("/r/n");
}
//递归组合
//nStart 开始数
//nMax: 最大数值
//nCount:组合的个数
//nIndex:组合索引(组合中的第几个数,0开始)
//p:数组指针
void func0(int nStart,int nMax,int nCount,int nIndex,int * p)
{
for (int i = nStart;i< nMax - nCount + nIndex + 2;i++)
{
*(p + nIndex) = i;
if (nCount - 1 == nIndex)
{
p2s(nCount,p);
}
else
{
func0(i + 1,nMax,nCount,nIndex + 1,p);
}
}
}
//组合算法
//n:范围:1~n
//nCount:组合的个数
void func(int n,int k)
{
int* p = new int[k];
func0(1,n,k,0,p);
}
int _tmain(int argc, _TCHAR* argv[])
{
func(4,2);
getchar();//等待退出
return 0;
}