C语言编程问题,请求大神帮我解释两个步骤 运用了递归,但是两个子函数我没看懂,不知道为什么这样做

C语言编程问题,请求大神帮我解释两个步骤运用了递归,但是两个子函数我没看懂,不知道为什么这样做问题是这样的:给定自然数1~n的集合,和自然数m,求各元素之和等于m的子集,... C语言编程问题,请求大神帮我解释两个步骤
运用了递归,但是两个子函数我没看懂,不知道为什么这样做问题是这样的:给定自然数1~n的集合,和自然数m,求各元素之和等于m的子集,设n=20,m=
C语言给定自然数1~n的集合,和自然数m,求各元素之和等于m的子集,设n=20,m=48.
求:(1)共有多少符合上述条件的子集?
(2)符合上述条件,且子集中元素数目为5的子集有多少?
那两个子函数是:
int xh(int n,int m){
if(1==m) return 1;
if(n<=1||m<=0) return 0;
int t=0;if(m==n)t=1;
return xh(n-1,m)+xh(n-1,m-n)+t;
}
int zxh(int n,int m,int c){
if(c<1||n<1||m<1||n<c)return 0;
if(1==c&&n>=m) return 1;
return zxh(n-1,m,c)+zxh(n-1,m-n,c-1);
}
展开
 我来答
kitty0702
推荐于2017-12-15 · TA获得超过1086个赞
知道小有建树答主
回答量:646
采纳率:66%
帮助的人:267万
展开全部
对于(1),也就是函数xh。
这个问题是在1到n的n个数中,取一些数出来,使得它们的和为m。
对于这个问题,有一些特殊情况:那就是a,b
a. 如果m=1,则只有一种情况,那就只用一种情况,只能取一个数,这个数就是1。
b. 如果不满足a,且 n<=1 或者m<=0, 那么将没有解,也就是有0种情况。
c. 如果不满足a和b,那么又可以分成两种情况(这是递归的关键之处),i.如果取最后一个数,且n就等于m,那就这一种情况也就是 t=1,若n<m,那么还需要在前面n-1个数中取一些数,它们的和只需要是m-n了(已经取了一个数n了),就是xh(n-1,m-n)这个式子;ii. 不取最后一个数,则需要在前面的n-1个数中取一些数,它们的和是m,也就是xh(n-1,m)。
经过上面c的分析,把原来n个数的问题,缩减为n-1个数的问题,这样递归下去,就可以使问题规模越来越小,直到规模为1,而直接得到解。

对于(2),也就是函数zxh。
更容易一些,那就是在 1到n的n个数中,取c个数出来,使得它们的和为m。
特殊的情况有:取数的个数c小于1, 集合数据个数小于1, 所取数据的和小于1,集合数据个数小于需要取数的个数,这些情况下都不能能有可能的取法,所以都是0
接下来,如果只取一个数,且 n>=m,那么就只有取m这个数一种情况。
在接下来的就分成两种:i.不取最后一个数,则需要在前面n-1个数中取c个数,它们的和是m,也就是 zxh(n-1,m,c);ii. 要去最后一个数, 则 需要在前面n-1个数中取c-1个数,它们的和是m-n,也就是zxh(n-1,m-n,c-1)了。

需要好好仔细理解,祝你早点想透
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式