/************************************************************************/
/* 问题:求从1到N相加和为X的序列集合,以及集合的记录数*/
/* 关于本解法:利用栈去存储序列项,采用递归的方法实现不同深度的遍历 */
/* EIT王子 2011-7-16 */
/************************************************************************/
#include
#include
#define SatckSize 20
//输出组合
void output(int * nums,int top,int linenum)
{
int i;
printf("%d...",linenum);
for(i=0;i<=top;i++)
printf("%d\t",nums[i]);
printf("\n");
}
//store存储空间statcktop栈顶,value压栈值,valsum值合,maxval最大取值,length空间剩入长度,judgevalue要匹配的值,*more保存序列组合的总条数
void recursion(int *Store,int stacktop,int value,int ValSum,int maxval,int length,int judgevalue,int* more)
{
int val;
Store[stacktop]=value;
ValSum+=value;
if(judgevalue==ValSum&&stacktop>=1)
{
*more=*more+1;
output(Store,stacktop,*more);
return;
}
else if(value0)
{
length--;
stacktop++;
for(val=value+1;val<=maxval;val++)
recursion(Store,stacktop,val,ValSum,maxval,length,judgevalue,more);
}
else
{
return;
}
}
void calc()
{
int N=20; //求N之前的数(N<=SatckSize)
int X=24; //求序列和等于X的序列
int S=0; //用来保存共有多少组这样的序列
int Store[SatckSize];//定义一个数组用做栈
int stacktop=0; //栈顶位置
int ValSum=0; //栈中序列的值
int base; //计算序列的起始值
for(base=1;base<=20;base++)
{
recursion(Store,stacktop,base,ValSum,X,N-base,X,&S);//采用递归技术来进行计算
}
printf("\n have %d lists\n",S);
}
void main()
{
calc();
system("Pause");
}