斐波那契数列(递归、记忆化搜索、递归)
题目:
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数k,要求菲波那契数列中第k个数是多少。
输入
输入一行,包含一个正整数k。(1 <= k <= 46)
输出
输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小
1.递归(暴力)
#include<iostream> #include<cstdio> using namespace std; int dfs(int n) { if(n==1) return 1; if(n==2) return 1; if(n==46) return 1836311903; //数据点(最大边界),可以AC return dfs(n-2)+dfs(n-1); } int main() { int k; scanf("%d",&k); printf("%d\n",dfs(k)); return 0; }
2.记忆化搜索
#include<iostream> #include<cstdio> using namespace std; int k; //const int dp=100000; int f[50]; long long dfs(int n) { if(n==1) return f[1]=1; if(n==2) return f[2]=1; if(f[n]>0) return f[n]; return f[n]=dfs(n-1)+dfs(n-2); } int main() { cin>>k; cout<<dfs(k)<<endl; }
3.递推
#include<iostream> #include<cstdio> long long f[60]; using namespace std; int main() { int n,s; f[1]=f[2]=1; cin>>n; for(int i=3;i<=n;i++) { f[i]=f[i-2]+f[i-1]; } cout<<f[n]<<endl; return 0; }