题目描述
有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。现在,我们有一对刚出生的这种兔子,那么,n个月过后,我们会有多少对兔子呢?假设所有的兔子都不会死亡。
输入
输入仅一行,包含一个自然数n(n≤40)。
输出
输出仅一行,包含一个自然数,即n个月后兔子的对数。
样例输入 Copy
5
样例输出 Copy
5
思路:
月 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
成兔 | 0 | 1 | 1 | 2 | 3 | 5 |
– | – | |||||
幼兔 | 1 | 0 | 1 | 1 | 2 | 3 |
– | – | |||||
总兔子 | 1 | 1 | 2 | 3 | 5 | 8 |
可以发现 f(n)=f(n-1)+f(n-2)
两个变量之间寻找关系
#include<iostream>//f(n)=f(n-1)+f(n-2)递归-时间取代空间,慢
#include<bits/stdc++.h>
using namespace std;
int birth(int n){
if(n==1) return 1;
if(n==2) return 1;
else return birth(n-1)+birth(n-2);
}
int main(){
int n;
cin >> n;
cout << birth(n);
return 0;
但题目可能会超时,因为递归是以时间代替空间的算法
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int cnt[100]={0,1,1};
for(int i=3;i<=n;i++){
cnt[i]=cnt[i-1]+cnt[i-2];
}
cout << cnt[n];
return 0;
}