关于前N数求等于X的递归解法(C语言)

本文介绍了一个使用递归方法求解从1到N相加和为X的所有可能序列组合的算法,并详细展示了如何通过栈来存储这些序列项。该算法能够有效地找出所有符合条件的序列集合及其数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/************************************************************************/
/* 问题:求从1到N相加和为X的序列集合,以及集合的记录数				*/
/* 关于本解法:利用栈去存储序列项,采用递归的方法实现不同深度的遍历  	        */
/*                                                EIT王子 2011-7-16  	*/
/************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#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(value<maxval&&ValSum<judgevalue&&length>0)
	{
		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");
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值