经典算法大全51例——2.斐波那契数列

算法目录合集

地址

说明

题目

原理分析

代码实现——Java

相关题目其他变形:

1.爬楼梯(来源:力扣LeetCode)

2.兔子成熟期拉长

官方题解

分析

代码——C语言

拓展

1.黄金矩形

2.等角螺线

3.设计

算法目录合集

地址

算法目录合集

说明

该地址指向所有由本人自己所经历的算法习题(也有可能仅仅是一个入门的案例或者是经典案例),仅仅为我做过而且比较有意思的,也许还会有一些我自己想出来的,出于兴趣写在这里,具体格式我会在下面列明,总目录也会在这里出现,方便查阅以及自己进行复习回顾。

题目

Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)……类似的道理也可以用于植物的生长,这就是Fibonacci数列,一般习惯称之为费氏数列,例如以下: 1、1 、2、3、5、8、13、21、34、55、89……

原理分析

斐波那契数列是一个非常有意思的数列,只不过它是由Fibonacci从一个兔子问题引出的,所以又叫做兔子数列。我们从最基本的数学思维来入手,我们第一次接触的数列是什么?等差、等比,所以一切数列我们都可以在次基础上演化,思考,去寻找规律。

而对于这个题,我们先看看Fibonacci是怎么引入这个问题的,首先,小兔子不生,一个后变成大兔子,大兔子会生,并且没有空怀期,也就是说每天增加的数量是前一天的大兔子数量,那么也就定性了——这不太可能是一个以乘积为规则的数列,明显是要以差值来进行约束变化规则的。

有了方向,我们就要开始对数列进行分析了:1、1 、2、3、5、8、13、21、34、55。这列数字的特点一眼看不出来,那就试试后项减去前项,寻找他们的差有没有什么特点:他们的差组成的数列如下:0、1、1、2、3、5、8、13、21,等等!! 你们看出了什么?没错,这组数列的差居然除了第一项和原数列相同:

从表格看,也就是说:

f1 (1) + f2 (1) = f1 (2)

f1 (2) + f2 (2) = f1 (3)

f1 (3) + f2 (3) = f1 (4)

……

f1 (n-1) + f2 (n-1) = f1 (n)

以此类推,那么既然差数列和原数列长的一样,何不把 f2 (n)替换成 f1 (n)呢,于是上面表达式可以变形为:

f1 (1) + 0 = f1 (2) 因为第一个f2 并没有与之对应的f1 ,所以直接用数值表示

f1 (2) + f1 (1) = f1 (3)

f1 (3) + f1 (2) = f1 (4)

……

f1 (n-1) + f1 (n-2) = f1 (n)

所以就得出了核心的表达式:

f(n) = f(n - 1) + f(n - 2) ( n > 1)

f(n) = n ( n =1 , 0)

代码实现——Java

/**

* @author g55zhw93

*/

public class Fibonacci{

public int climbStairs(int n) {

int result = 0;

if (n < 0) {

return 0;

}

if (n == 0 || n == 1) {

return 1;

}

int[] values = new int[n + 1];

values[0] = 1;

values[1] = 1;

for (int i = 2; i <= n; i++) {

values[i]=values[i-1]+values[i-2];

}

return values[n];

}

相关题目其他变形:

1.爬楼梯(来源:力扣LeetCode)

第一个典型变形就是爬楼梯的问题,题目详见——力扣——70.爬楼梯(简单难度)——学会将实例化的问题剖析为规律性问题;

其实这里用到的思想是一个类似于递归的思想,但是解题时候并不需要递归;

这道题其实可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和,即:

爬上 n−1 阶楼梯的方法数量。因为再爬1阶就能到第n阶

爬上 n−2 阶楼梯的方法数量,因为再爬2阶就能到第n阶

也就是说, f(n) = f(n - 1) + f(n - 2)

这不就转化成了斐波那契数列问题了。这里仅仅做一个简单的分析,全面分析在上面文章有,有兴趣的可以看看

2.兔子成熟期拉长

这个变形是我自己瞎想的,总得给自己找点儿事儿不是?原题是一月一成熟,那么我们一点儿一点儿增加,先看看2月一成熟的情况:

从表格看,可以得出

f1 (1) + f2 (1) = f1 (2)

f1 (2) + f2 (2) = f1 (3)

f1 (3) + f2 (3) =f1 (4)

……

f1 (9) + f2 (9) = f1 (10)

f1 (10) + f2 (10) = f1 (11)

……

f1 (n-1) + f2 (n-1) =f1 (n)

以此类推,那么既然差数列和原数列长的一样,何不把 f2 (n)替换成 f1 (n)呢,于是上面表达式可以变形为:

f1 (1) + 0 = f1 (2)

f1 (2) + 0 = f1 (3)

f1 (3) + f1 (1) = f1 (4)

……

f1 (9) + f1 (7) = f1 (10)

f1 (10) + f1 (8) = f1 (11)

……

f1 (n-1) + f1 (n-3) = f1 (n)

从表格看,可以得出

f1 (1) + f2 (1) = f1 (2)

f1 (2) + f2 (2) = f1 (3)

f1 (3) + f2 (3) =f1 (4)

……

f1 (9) + f2 (9) = f1 (10)

f1 (10) + f2 (10) = f1 (11)

……

f1 (n-1) + f2 (n-1) =f1 (n)

以此类推,那么既然差数列和原数列长的一样,何不把 f2 (n)替换成 f1 (n)呢,于是上面表达式可以变形为:

f1 (1) + 0 = f1 (2)

f1 (2) + 0 = f1 (3)

f1 (3) + 0 = f1 (4)

……

f1 (9) + f1 (6) = f1 (10)

f1 (10) +f1 (7) = f1 (11)

……

f1 (n-1) + f1 (n-4) = f1 (n)

后面就继续写了,我们发现了一个规律:

m月一成熟

兔子在n月的数目表达式

1

f1 (n-1) + f1 (n-2) = f1 (n)

2

f1 (n-1) + f1 (n-3) = f1 (n)

3

f1 (n-1) + f1 (n-4) = f1 (n)

……

……

m

f1 (n-1) + f1 (n - 1 - m) = f1 (n)

迎刃而解~~~~

官方题解

分析

依说明,我们可以将费氏数列定义为以下:

f(n) = f(n - 1) + f(n - 2) ( n > 1)

f(n) = n ( n =1 , 0)

代码——C语言

#include

#define N 20

int main(void) {

int Fib[N] = {0};

int i;

Fib[0] = 0;

Fib[1] = 1;

for(i = 2; i < N; i++)

Fib[i] = Fib[i-1] + Fib[i-2];

for(i = 0; i < N; i++)

printf("%d ", Fib[i]);

printf("\n");

return 0;

}

拓展

说完了正儿八经的东西,想给大家看点儿其他的东西:

1.黄金矩形

这个其实是斐波那契数列的另一种解题思路:下一个正方形面积的边长肯定是之前的两个边长之和,这样拼成的矩形又被称为斐波那契矩形,而这个矩形随着数列的递增,其实是越来越接近黄金矩形的:

2.等角螺线

由这个矩形中的正方形画出的弧,构成的曲线又叫做等角螺线,随着矩形的增大,这个图形就会变的非常好看:

自然界中很多蜗牛,海里的壳类生物都拥有这种黄金分割的自然之美

3.设计

同时也有很多人,把这种黄金分割用于设计:

不得不说,大神之所以是大神,是因为人家确实是大神,哈哈哈哈,这不禁让我想起了鲁迅的名句::“数学的应用并不唯一,我只觉得NB!!!”

c语言 兔子数列螺线图,经典算法大全51例——2.斐波那契数列(兔子数列)相关推荐

  1. 经典算法大全51例——3.杨辉三角(又称帕斯卡三角形)

    经典算法大全51例--3.杨辉三角(又称帕斯卡三角形) 算法目录合集 地址 说明 题目以及个人题解 原理分析 思路一--纵向寻踪 思路二--横向寻踪 代码实现--Java 方式一--纵向寻踪 方式二- ...

  2. 经典算法大全51例——56.老鼠走迷官

    经典算法大全51例--5&6.老鼠走迷官 算法目录合集 地址 说明 题目以及个人题解 说明 题目 原理分析 问题① 原理 代码实现--Java 问题② 原理 代码实现--Java 相关题目其他 ...

  3. python侯先生爬楼梯_经典算法题:爬楼梯 ,以斐波那契数列来解题代码案例

    网上这题的解题思路主要有两种:动态规划 斐波那契数列 因为我们用斐波那契数列来解,所以我主要描述方法2. 斐波那契数列 又称 兔子数列, 指得是:1.1.2.3.5.8.13.21.--, 在数学上它 ...

  4. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

  5. 每日C语言代码(The third day)——斐波那契(兔子数列)

    今天来讲一个很常见的代码--斐波那契数列,虽然有很多人都发布了,但是我这次想要做一个比较深层次的分析! 编程求fibonacci数列:1,1,2,3,5,8--的前n个数. 首先我们先来解析一下这个数 ...

  6. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...

  7. 斐波那契数列c++代码_轮到你了,斐波那契数列!

    前阵子,日剧"轮到你了"终于大结局了,虽然结局有点一言难尽,但黑岛和二阶堂两个学霸之间的爱情,还是很甜呢呐!两个学霸之间的默契的斐波那契数列也被许多网友认为是凶手行凶的依据.到底这 ...

  8. 斐波那契生兔子问题(一月大兔子生a对,二月大兔子生b对,三月大兔子生c对。。。)

    现提出一个问题:一对兔子一个月大时可生育a对兔子,两个月大的兔子生育b对兔子,三个月大及以后的兔子生c对兔子.假设兔子不死,现有1对兔子,问N个月后有多少只兔子. 看起来这是一个递推数列的问题,要注意 ...

  9. python利用列表计算斐波那契数列前30项并输出_python 题目:斐波那契数列计算;题目:站队顺序输出;题目:合法括号组合的生成;题目:用户登录(三次机会)...

    斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波 ...

最新文章

  1. WPF窗口长时间无人操作鼠标自动隐藏
  2. OpenStack OVS实现安全组(五)
  3. stm32f4 RAM中运行程序 读保护设置
  4. 【控制】《多无人机协同控制技术》周伟老师-第1章-无人机协同控制技术概述
  5. python scikit learn 关闭开源_慕课|Python调用scikit-learn实现机器学习(一)
  6. linux下qt制作日历,课内资源
  7. 【FLink】Flink Forward Asia Hackathon (2021) 回顾
  8. python 埋点_scala spark 埋点统计_spark—1:WordCount(Python与Scala对照)
  9. 一文搞懂前端对象的深拷贝与浅拷贝
  10. linux的网络配置有线线缆被拔出
  11. C语言解释一下BA无标度网络
  12. BT.2020 新一代超高清UHD视频制作与显示系统标准
  13. WGS84坐标系、Web墨卡托、GCJ02坐标系、BD09坐标系—常用坐标系简述
  14. 云虚拟主机搭建个人博客
  15. 【堡垒机测评】关于纽盾堡垒机、jumpserver堡垒机、行云管家堡垒机的使用对比
  16. 中国电力自动化行业发展态势与前景建议报告2022-2028年版
  17. 视频压缩存储方案助力智慧城市
  18. 12306登录python_Python模拟登录12306
  19. js通过UA判断ios、android、微信、qq、qq浏览器
  20. 我从事的软件培训果真是一个很不入流的职业吗?

热门文章

  1. JTS 空间数据关系分析
  2. 关于sql语句中的count(*),count(1),count(具体字段)的介绍
  3. Oracle安装时先决条件检查失败和[INS-35180] 无法检查可用内存问题解决
  4. 安卓手机 python ide_三大主流 Python IDE,你中意哪一款?
  5. 无线AP一般使用的2.4G跟5G的信道有哪些?
  6. arch检验python_Python玩转金融时间序列之ARCH与GARCH模型
  7. QQ浏览器之后,Vivo NEX又检测出百度手机输入法后台录音
  8. c# 整数除法取整_如何在C#中计算整数的除法和取模?
  9. t972和鸿蒙818,鸿鹄818全面吊打Amlogic T972?荣耀智慧屏的优势太明显了吧!
  10. eclipse给mysql修改表数据_Eclipse中java向数据库中添加数据,更新数据,删除数据...