一个有关C 的编程问题!!!!!!!!!!!

设m、n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目。例如,f(5,3)=5,有5种表示方法:3+2,3+1+1,2+2+1,2+1+... 设 m、n 均为自然数,m 可表示为一些不超过 n 的自然数之和,f(m,n) 为这种表示方式的数目。

例如,f(5,3)=5,有5种表示方法:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1。

请编写程序,计算f(m,n)的值。

输入:
m n

输出:
f(m,n)的值

程序如下:
#include<stdio.h>
int f(int y,int x)
{
if(y==1) return 1;
if(x==1) return 1;
if(y<x) return f(y,y);
if(x==y) return 1+f(y,x-1);
return f(y,x-1)+f(y-x,x);
}
main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",f(m,n));
}

麻烦大虾帮我解释下这个递归是什么意思,最好详细点,小弟完全看不懂。。。。。。。。
展开
 我来答
tanzhangwen
2011-05-31 · TA获得超过1136个赞
知道小有建树答主
回答量:499
采纳率:0%
帮助的人:848万
展开全部
递归解释:
1.if(y==1) return 1; 小于等于x的自然数的和为y=1,显然只有1一种方法
2.if(x==1) return 1; 表示只能用1来求和为x,方法数肯定是只有1个,就是x个1的和
3.if(y<x) return f(y,y);不超过x的自然数表示的和为y,y小于x,显然和中的任何一个数都不能大于y,否则就超了,所以实际上只用到了不超过y的自然数来求和,自然是f(y,y)
4.if(x==y) return 1+f(y,x-1); x=y时候可以用y=x来表示是一种,其他情况的和的每个加数都应该小于x,也就是不超过x-1的数,即f(y,x-1)
5.return f(y,x-1)+f(y-x,x); 这种情况实际就是y>x的情况。可以全部用不超过x-1的数(不用x)来表示和,个数为f(y,x-1)。或者至少用一个x来求和,那么剩下的y-x个数就是f(y-x,x)

我这只是给你提供了一种思考的角度,具体你可以按我的介绍去想。也就是通过讨论不同的情况,把问题逐渐降低维度,另外还有终止条件,如这里的1,2.这样递归就能结束。
追问
5.return f(y,x-1)+f(y-x,x); 这种情况实际就是y>x的情况。可以全部用不超过x-1的数(不用x)来表示和,个数为f(y,x-1)。或者至少用一个x来求和,那么剩下的y-x个数就是f(y-x,x)

不好意思,这种情况前半部分懂了,后半部分还是不太懂,“剩下的y-x个数”是什么意思?
追答
我说的可能不太清楚,不是剩下的y-x个数,是和要为y,现在我已经选了一个加数x,这样跟前面的情况肯定不一样。那么剩下的加数的和就应该为y-x,对吧。剩下的y-x依然要由不超过x的数的和来得到,方法数就是f(y-x,x)
不清楚再问吧
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式