zoukankan      html  css  js  c++  java
  • 经典问题之费式级数

    问题:
    Fibonacci 为 1200 年代 的 欧洲 数学家, 在 他 的 著作 中 曾经 提到: "若有 一只 免 子 每个月
    生 一只 小 免 子, 一个月 后 小 免 子 也 开始 生产. 起初 只有 一只 免 子, 一个月 后 就有 两只
    免 子, 二个月 后 有 三 只 免 子, 三个月 后 有 五 只 免 子 (小 免 子 投入 生产 )......"。
    如果 不太 理解 这个 例子 的 话, 举 个 图 就 知道 了, 注意 新生 的 小 免 子 需 一个月 成长期
    才会 投入 生产, 类似 的 道理 也 可以 用于 植物 的 生长, 这 就是 数 列 Fibonacci, 一般 习惯
    称之 为 费 氏 数 列, 例如 以下:
    1,1, 2,3,5,8,13,21,34,55,89 ......

    思路:

    以上数字有如下规律,
    当n>2时,f(n)=f(n-1)+f(n-2)
    当n<2时,f(n)=1
    其中,n为兔子数目,n>=1


    代码:
    递归算法代码:

    int f(n){
    if(n<=2)
    return 1;
    else return (f(n-1)+f(n-2));
    }


    算法简单,但是效率极差.因为已经计算过的值他会重复计算.比如f(3)计算过,如果我现在计算f(5),我需要f(3)的值,递归算法要在此计算f(3)

    下面这个方法以空间换时间,就是预先定义一个较大的数组,存储各个f(n)的值

    #include <stdio.h>
    #include
    <stdlib.h>

    #define N 20

    int main(void) {
    int fib[N] = {0};
    int i;

    fib[
    1] = 0;
    fib[
    2] = 1;

    for(i = 3; i <= N; i++)
    fib[i]
    = fib[i-1] + fib[i-2];

    for(i = 1; i <= N; i++)
    printf(
    "%d ", fib[i]);
    printf(
    "\n");

    return 0;
    }

    也可以通过通项公式计算:

    费式级数通项公式

    整理编辑: 东苑草根 zjut
  • 相关阅读:
    windows下查看端口占用情况及关闭相应的进程
    python学习中的一些“坑”
    python 中一些关键字的区别
    linux下配置Tomcat开机启动
    windows 下的python 安装pycrypto
    'redis-server' 不是内部或外部命令,也不是可运行的程序或批处理文件
    怎么学习代码
    crx文件不能安装,提示无效的安装包
    回调函数
    koa-router的作用
  • 原文地址:https://www.cnblogs.com/dycg/p/1781498.html
Copyright © 2011-2022 走看看