目录
描述
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
解题过程
记得大一学习C语言的时候学过,用的是递归+子函数的方法,但是时间久了就忘记了。当然也可以不用子函数。看了讨论区restudy了两种方法。
提交代码
递归+子函数方法
#include <stdio.h>
int rabbit(int x )
{
if(x<3)
return 1;
else return rabbit(x-1)+rabbit(x-2);
}
int main() {
int n;
while (scanf("%d", &n) != EOF)
printf("%d",rabbit(n));
return 0;
}
递归+不用子函数方法(数组)
略。
学习代码
(来源:https://www.nowcoder.com/users/974547592)
动态规划(形式一)
#include <stdio.h>
int rb(int n){
if(n<3){
return 1;
}
int dp[n+1];//我想,是因为有一个dp[0],所以才是dp[n+1]
dp[1]=dp[2]=1;
for(int i=3;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
int main(){
int n;
scanf("%d",&n);
printf("%d",rb(n));
}
动态规划(形式二)
#include <stdio.h>
int rb(int n){
if(n<3){
return 1;
}
int a,b,c;a=b=1;
for(int i=3;i<n+1;i++){
c=a+b;a=b;b=c;
}
return c;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",rb(n));
}