Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】

问题链接POJ NOI0202-1755 菲波那契数列

 

菲波那契数列

 

 

总时间限制: 

1000ms 

内存限制: 

65536kB

描述

菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数是多少。

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 20)

输出

输出有n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数的大小

样例输入

4
5
2
19
1

样例输出

5
1
4181
1

 

 

 

问题链接Bailian2753 菲波那契数列

问题分析

  菲波那契数列的计算问题是常见程序问题,可以用递归函数实现,也可以用递推计算过程实现,项多了则需要打表以减少重复计算。

  追加了一个记忆化递归的版本。

程序说明:(略)

题记:数列的项多了则需要打表来减少重复的计算。

 

AC的C语言程序(记忆化递归)如下:

/* Bailian2753 菲波那契数列 */

#include <stdio.h>
#include <string.h>

#define N 20
int f[N + 1];

int fib(int n)
{
    if(f[n])
        return f[n];
    else if(n == 1 || n == 2)
        return f[n] = 1;
    else {
        if(f[n - 2] == 0) f[n - 2] = fib(n - 2);
        if(f[n - 1] == 0) f[n - 1] = fib(n - 1);
        return f[n] = f[n - 2] + f[n - 1];
    }
}

int main(void)
{
    memset(f, 0, sizeof(f));

    int n, a;
    scanf("%d", &n);
    while(n--) {
        scanf("%d", &a);

        printf("%d\n", fib(a));
    }

    return 0;
}

 

AC的C语言程序如下:

/* Bailian2753 菲波那契数列 */

#include <stdio.h>

int fib(int n)
{
    return (n == 1 || n == 2) ? 1 : fib(n - 2) + fib(n - 1);
}

int main(void)
{
    int n, a;

    scanf("%d", &n);
    while(n--) {
        scanf("%d", &a);

        printf("%d\n", fib(a));
    }

    return 0;
}

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值