MATLAB新手简明使用教程(四)——斐波那契数列——新手来看,保证看懂。
在上一篇我们学习了下面 的知识点: 使用roots函数求一元二次方程的根。使用solve函数求方程的根。使用inline函数和ezplot函数一起绘制函数图形。使用 fzero 函数和 plot 函数绘制某一点处的零点。
斐波那契数列是一个很有趣的数列,有趣的地方在两点,在说这两点之前,我们先来看看斐波那契数列的前几项:
1 1 2 3 5 8 13 21 34 ..........................................
有趣地方在于: 这个很容易发现,即后一个元素等于前两项元素之和:2 = 1 + 1, 3 = 1 + 2, 5 = 2 + 3 ...................结合某些真实存在的现状,网上甚至有一个段子叫做:今天的汤 = 前天的汤 + 昨天的汤。这个有趣的地方,很少有人发现,上一讲中我们谈到了黄金分割数:两个数的比例是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 中写的是我们自己写的斐波那契数列计算函数,下面我们来逐一编写。
或许有人会问:我们还没写怎么能调用呢?岂不是错了?
这里是一种思想,我自己总结为了一句话:我调用你,与你无关。
说详细点就是:我们写代码时,把各个功能包装称为一个一个的函数,我们不需要关注怎么实现,我们只需要关注两个东西: 目标函数需要什么参数?目标函数返回的什么数据?
只要这两个东西和我们需要的、能提供的一样,那么我们就能用。这种思想可以叫做:模块化。
所以,上面代码中,我们先使用,到时候只需去实现这个功能即可。
这个代码需要逐句来讲,连带注释总共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。
我们已经讨论过,斐波那契数相邻两项比值是黄金分割数,大家自己动手验证一下吧!!!
今天,我们通过计算斐波那契数列,学到了下面的知识点: 如何声明、定义、调用函数(文件)。给函数传递参数、接受函数的返回值。matlab中矩阵的简单使用和下标索引。一句话:我调用你,与你无关。即软件工程的思想:模块化。matlab中for循环(遍历)的使用。如何从一个文件调用另一个函数文件。
好啦,今天就到这里,如果有不懂得,欢迎大家评论、留言、私信。
如果觉得写得好,你的赞是对我的最大的鼓励^_^
最近更新热点资讯
- 谷歌AI聊天记录让网友San值狂掉:研究员走火入魔认为它已具备人格,被罚带薪休假
- 豆瓣9.4,姐弟恋、三人行,这部大尺度太厉害
- Genes, Intelligence, Racial Hygiene, Gen
- 【土耳其电影】《冬眠》电影评价: 宛如一部回归伯格曼风格的道德剧
- 陌生人社会伦理问题研究
- 理论研究|前海实践的价值理性和工具理性
- 澳门刑事证据禁止规则
- 综艺普及剧本杀和密室逃脱助力线下实体店爆发式增长
- 日本小伙和五个小姐姐同居?看完我酸了!
- 第一学期高一语文考试期中试卷
- 高中必考的物理公式有哪些
- 这部大尺度的申奥片,却讲述了不lun恋...
- 心理语言学论文精品(七篇)
- 《贵妃还乡》 超清
- 专论 | 郭丹彤、陈嘉琪:古代埃及书信中的玛阿特观念
- 微专业招生 | 数字文化传播微专业列车即将发车,沿途课程抢先看!
- 生态安全的重要性汇总十篇
- 原创因“18禁”电影登舆论顶峰,万千少女一场春梦:这一生,足够了
- 章鱼头
- 读书心得体会
- 考研考北京大学医学部或者协和是一种怎样的难度?
- 央媒评女主播编造“夜宿故宫”:让肇事者付出代价,理所应当
- 库欣病患者求医记(流水账)
- 《太平公主》④ | 地位越高,越要装傻
- 爱体检 安卓版 v2.5