递归算法题解析:设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目
题源:中科院软件所 1997 二,1(9分)设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目。例:f(5,3)=5,有五种表示方式:3+23+1+12+2+12+1+1+11+1+1+1+1请补全递归代码。答案#include<stdio.h>int f(int m, int n);int main(){int m,n,ans;scanf("%d
题源:中科院软件所 1997 二,1(9分)
设m,n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目。
例:f(5,3)=5,有五种表示方式:
3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1
请补全递归代码。
答案
#include<stdio.h>
int f(int m, int n);
int main()
{
int m,n,ans;
scanf("%d%d",&m,&n);
ans = f(m,n);
printf("%d\n",ans);
}
int f(int m, int n)
{
if(m == 1)
return 1;
if(n == 1)
return 1;
if(m == n)
return (1 + f(m, n-1));
else if(m < n)
return f(m, m)
else // (m > n)
return (f(m - n, n) + f(m, n - 1));
}
第一行定义了f(m,n)
这个函数,返回值即表示方式的数目,为一个整数.
第二行定义了 m 和 n 这两个自变量为整数.
if (m==1) return 1;
这里是说如果m等于1,则函数的返回值为1,显然1只能分解为1,也即表示方式只有一种.
if (n==1) return 1;
这里是说如果n等于1,则函数的返回值为1,显然无论m多大,n为1时只能表示为m个1之和,也即表示方式只有一种.
当m>n时,f(m,n) 可以递归地分解为两种情况:
当最大加数包含n时,即f(m-n, n)
当最大加数不包含n时,即f(m, n-1)
以 f(6, 4)
为例:
而当 m>n 时,比如 f(6,4),可以分成两类讨论:
- 如果最大的加数为3,则按照定义共有f(6,3)种表示方法;
- 而剩下的表示方法中必然有一个最大的加数4,由于总和为6,因此可知其余的加数之和为6-4=2,而要使小于等于4的自然数之和等于2,按照函数定义,共有f(2,4)种可能性。
- 因此,f(6,4) = f(6,3) + f(2,4)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)