本题,是一个典型的递归类问题,递归类问题,可以使用递归函数来解决,参照斐波那契数列的写法,可以仿写出来(初学者而言)
对于参赛选手的我们要学会分析问题,并将其转化为代码语言,代码量很少,难在思维,如果同学们可以理解并掌握思维方法,那么在少的代码量和好的代码风格将是得分的利器。
话不多说,正式开始分析,本题。
我们从题目可以知道,当天数也就是n小于或等于7天是,发展的人数只有一人,同样新推广出来的人也必须要超过七天才可以推广新的人,那么我们对天数进行分析,如果从推广第一个人开始,推广天数少于7天,那么就只有一个人,这便是递归的出口!
if (n<=7) return 1;
以上代码便是出口的定义,切记递归函数一定有出口!
递归的危害,一旦递归使用的量级过大,会占用极大的系统资源,上图是递归一个量级偏大的数,所占用的内存和cpu资源都是如此,所以,如果没有定义出口,递归就会一直进行下去,其产生的后果将难以估计。慎用递归,但是一定要会合理的使用递归。
出口找到后,就要开始分析出递推公式,递推公式有那些成分?
取决于所面临的问题,也就是对应的方法,推广有两个条件,新人有7天的观察期,七天过后每三天就可以推广一个人,大于七天少于11天最少也是两个人。
对公式进行描述,假设总推广日期大于7天,那么人员组成就成了,过了七天之后,推广的第一个人,他自己和他推广的人,还有就是总天数减三天,来看看是不是还大于7天,如果大于七天,就要返回这个人和这个人推广的人数,少于七天,则会触发递归出口(初始推广者就是这次触发出口而加的人),那么大于七小于11天就是第八天推广的人和自己两个人。
对上述进行代码语言描述:
int f(int n){ if(n<=7) return 1; else return f(n-7)+f(n-3); }
实现递归函数之后,这次的题目也就游刃而解了
#include <iostream> using namespace std; int print(int n){ if(n<=7) return 1; else return print(n-7)+print(n-3); } int main() { int n; cin>>n; cout<<print(n)<<endl; }