斐波那契数列(递归、记忆化搜索、递归)

题目:

菲波那契数列是指这样的数列: 数列的第一个和第二个数都为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;
}

 

posted @ 2022-09-25 19:22  为么要取名字  阅读(134)  评论(0编辑  收藏  举报