前期回顾

在上一篇我们学习了下面 的知识点:

  1. 使用roots函数求一元二次方程的根。
  2. 使用solve函数求方程的根。
  3. 使用inline函数和ezplot函数一起绘制函数图形。
  4. 使用 fzero 函数和 plot 函数绘制某一点处的零点。

前言

斐波那契数列是一个很有趣的数列,有趣的地方在两点,在说这两点之前,我们先来看看斐波那契数列的前几项:

1 1 2 3 5 8 13 21 34 ..........................................

有趣地方在于:

  1. 这个很容易发现,即后一个元素等于前两项元素之和:2 = 1 + 1, 3 = 1 + 2, 5 = 2 + 3 ...................结合某些真实存在的现状,网上甚至有一个段子叫做:今天的汤 = 前天的汤 + 昨天的汤。
  2. 这个有趣的地方,很少有人发现,上一讲中我们谈到了黄金分割数:两个数的比例是1.618...或者0.618...,如果我们细心一算,前一项除以后一项大概约等于0.618...,后一项除以前一项等于1.618...,并且越靠后的数,这个结果就越精准。

正文开始啦:

斐波那契数列大概(可能会错,但是这个不重要,重要的是知识)是来源于这个问题:说初始给你一对兔子,一个月后生育出一公一母,兔子生下后一个月后即可开始生小兔子。(这里要抛弃伦理问题,并且出生必是一公一母,并且老兔子还不会死能一直生,反正让我想我是想不出来这种东西的。)问,n个月后总共有多少对兔子。

一般类似于这种的问题都可以认为是斐波那契问题,说实话,这种现象还真的挺常见的,比如:树枝发芽啊(假设一个树枝一年生出一根小树枝,小树枝一年后开始分叉)、植物花瓣、动物羽毛好像都是这种数。

现在以兔子为例吧,浅显易懂,假设函数是 f(n) ,其中 n 是月数,容易知道,f(1) = 1, f(2) = 2.......那么第 n 天的兔子数量就是:

下面我们就开始实现这些东西了:

总体思路:

我有个习惯,做东西之前先想思路,这个功能,我的思路大概是这样的:两个文件,一个文件中写的是计算斐波那契数的函数,另一个作为主文件运行、调用并且打印输出。

首先创建文件:

fibo_use.m 是用来调用的“主”函数,fibonacci_mine.m 中写的是我们自己写的斐波那契数列计算函数,下面我们来逐一编写。

编写 fibo_use.m 文件的内容代码

%% 清理可能存在的旧数据
clc; % 清屏
clear;  % 清除变量
close;  % 关闭可能存在的窗口
%% 我们在这里调用,这里是主要代码
n = 5; % 我们计算前几个斐波那契数列
res = fibonacci_mine(n);  % 调用计算函数
disp('结果是:')
disp(res);  % 打印结果

或许有人会问:我们还没写怎么能调用呢?岂不是错了?

这里是一种思想,我自己总结为了一句话:我调用你,与你无关。

说详细点就是:我们写代码时,把各个功能包装称为一个一个的函数,我们不需要关注怎么实现,我们只需要关注两个东西:

  1. 目标函数需要什么参数?
  2. 目标函数返回的什么数据?

只要这两个东西和我们需要的、能提供的一样,那么我们就能用。这种思想可以叫做:模块化。

所以,上面代码中,我们先使用,到时候只需去实现这个功能即可。

编写 fibonacci_mine.m 文件中的代码

function fibo = fibonacci_mine(n)
% 功能:计算前n个斐波那契数列
% 参数:n 代表需要前n个斐波那契数列
% 返回值: fibo  一个 n行1列的矩阵,代表前n个斐波那契数
fibo = zeros(n, 1);  % 把fibo作为n行1列的空矩阵,里面元素都为0
fibo(1) = 1;
fibo(2) = 2;  % 把启动条件写出来
for k = 3:n  % for 循环,从 3 到 n(包含 3 也包含 n)fibo(k) = fibo(k-1) + fibo(k-2);
end
return 

这个代码需要逐句来讲,连带注释总共11行,下面我将详细讲解(标号为几就是第几行):

1. 这句话表名这个文件不是普通的脚本文件,而是一个函数文件,在matlab中,我们可以认为每个文件都是可以被独立执行的个体,这句话的格式是这样的:function  返回值名字 = 文件名(参数列表)

在本文件中,返回值是:fibo,文件名是 fibonacci_mine,参数一个: n。

2-4. 这三个注释是一个规范,不是强制要求。如果我们在这个地方介绍我们这个函数的功能,对使用者来讲,是非常方便的,可以通过help命令直接看到这个帮助信息。如下图:

而对于程序员来说,易读易懂的文档是很重要的。

5. zeros(行, 列):返回一个矩阵,矩阵是 n 行 n 列,内容都是0。这句话是把返回值初始化为n行1列的0矩阵了。

6-7. 斐波那契数列的前两项是1和1没错,但是现在解决的问题是兔子问题,所以根据实际情况剔除一个1,大家不要纠结。

8-10. matlab 的for 循环,必须以end结束。说循环,其实说遍历更加恰当一点。for循环是把变量k从3->n各取一次,在这个循环中,k的取值范围是:

 既包含3也包含k。

在循环内部,我们直接用累加打表计算(第5行定义一个空矩阵也是为了打表,这样能节省很多时间,否则每次都重新计算太耗时了,这个程序尽量不要用递归,即使用递归,打表也是好的选择。)

11. return 程序结束,返回我们的返回值 fibo,当然可以省略。

代码运行

终于我们理解了上面的代码,下面来看看结果吧,品尝胜利的果实:

如果我们想增加数量,改变 fibo_use中的n的值。

如果我们只想看最后一个的值,则这样写:

是的,matlab的矩阵以1为起始下标,没有0。

小作业

我们已经讨论过,斐波那契数相邻两项比值是黄金分割数,大家自己动手验证一下吧!!!

今日总结

今天,我们通过计算斐波那契数列,学到了下面的知识点:

  1. 如何声明、定义、调用函数(文件)。
  2. 给函数传递参数、接受函数的返回值。
  3. matlab中矩阵的简单使用和下标索引。
  4. 一句话:我调用你,与你无关。即软件工程的思想:模块化。
  5. matlab中for循环(遍历)的使用。
  6. 如何从一个文件调用另一个函数文件。

好啦,今天就到这里,如果有不懂得,欢迎大家评论、留言、私信。

如果觉得写得好,你的赞是对我的最大的鼓励^_^

MATLAB新手简明使用教程(四)——斐波那契数列——新手来看,保证看懂。相关推荐

  1. 用PYTHON画斐波那契数列银杏树(代码可复制)

    今天我们来画斐波那契数列银杏树,先看一下结果: 首先,我们先引入turtle,random,math三个包. import turtle import random import math 斐波那契数 ...

  2. MATLAB基础教程(5)——斐波那契数列

    目录 前言 正文开始啦: 总体思路: 首先创建文件: 编写 fibo_use.m 文件的内容代码 编写 fibonacci_mine.m 文件中的代码 代码运行 总结: 前言 斐波那契数列是一个很有趣 ...

  3. 斐波那契数列的四种实现

    来自:Crossin的编程教室 孔乙己自己知道不能和他们谈天,便只好向 Intern 说话.有一回对我说道,"你写过代码么?"我略略点一点头.他说,"写过代码,--我便考 ...

  4. matlab兔子繁殖问题,斐波那契数列在《疯狂动物城》兔子繁衍中的应用

    摘    要: 计算思维的构建有助于帮助学生将实际问题转换为透明易懂的框架算法, 并借助计算机解决.以电影<疯狂动物城>中的兔子繁殖问题为例, 引出斐波那契数列, 引导学生将数学表达式转化 ...

  5. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

  6. 剑指Offer #07 斐波那契数列(四种解法)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 题目解析 ...

  7. python斐波那契数列第四十项_科学网—不死神兔的繁衍生息——神奇的斐波那契数列 - 霍开拓的博文...

    不死神兔的繁衍生息--神奇的斐波那契数列 • 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契.在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月 ...

  8. matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序

    斐波那契数列数列从第3项开始,每一项都等于前两项之和. 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,25 ...

  9. 斐波那契数列的四种实现方式(C语言)

    斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列, 像这样的:1.1.2.3.5.8.13.21.34.55...... 今天,我们用四种方式来进行实现: 1.递归 ...

最新文章

  1. 用计算机能改装成万用表吗,用旧手机电池修改万用表
  2. 视频监控:特征识别真的优于人脸识别吗?
  3. LIGHTOJ 1044(动态规划)
  4. 第一行代码学习笔记第七章——探究内容提供器
  5. linux ubuntu 安装安卓,借助ubuntu电脑,给安卓手机安装整套ubuntu14.04
  6. 重要的是改变命运,而非升职加薪
  7. 【转载】Direct3D基础知识
  8. 前端性能优化篇——浏览器http同域名并发请求对限制
  9. python中int什么意思_python3中int(整型)的使用教程
  10. 人工智能必备数学知识· 学习笔记 ·001【线性回归,最小二乘法梯度下降法】
  11. go语言和php哪个建站好,从0开始Go语言,用Golang搭建网站
  12. 跨境电商四种物流方式介绍-扬帆凌远
  13. BackTrack5(BT5)硬盘安装完美教程
  14. 建立线上思维,创客匠人教你打造线上教学服务生态圈
  15. 【UVA11478】Halum (最短路解差分约束)
  16. 【虚幻引擎UE】UE5 UMG布局和视觉设计(自适应篇)
  17. xgb.cv进行交叉验证
  18. 小松鼠邮件(squirrelmail)服务器部署(squirrelmail+Postfix)
  19. Scratch教程——月亮公转和地球自转
  20. 最好的OCR识别软件:ABBYY FineReader中文绿色版

热门文章

  1. 纯纯的css画美美的彩虹
  2. 一直播回放视频怎么保存到本地电脑 经验分享
  3. 史上最简单最全最基础入门到精通的opencv图像处理 第七课:图像阈值
  4. 减一天_减腹部小运动,做完后一天瘦一斤,还你健康还你美丽
  5. 如何监听电脑屏幕是否发生切换
  6. PJNATH库关于NAT穿越问题及解决方案
  7. Nodejs实战之二(使用 superagent 与 cheerio 完成简单爬虫)
  8. syswow64删除文件_syswow64,小编教你syswow64是什么文件夹
  9. SSM框架示例(适合新手)
  10. 【U8】固定资产模块折旧分配表无法生成处理方法