内容正文:
斐波那契数列
《计算之书》——兔子问题
故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?10年呢?
斐波那契数列
1月 1幼
2月 1成
3月 1成+1幼
4月 2成+1幼
5月 3成+2幼
从第3个月起,每个月大兔子的对数等于上个月大兔子与小兔子的对数之和(即上个月兔子总对数),每个月小兔子的对数等于上个月大兔子的对数(即上上个月兔子总对数)。
斐波那契数列——WPS
我们发现,当计算到第74个月的时候,由于数据范围及表示精度的问题,导致结果出错。
本质原因:WPS表格的数值精度限制。其使用双精度浮点数(64位)存放数字,有效数字最多是15-17位,超过这个位数,后面的数字会被四舍五入/截断,导致精度丢失,看起来“出错”。
斐波那契数列——Python(迭代法)
迭代法也称辗转法,是用计算机解决问题的一种基本方法。迭代通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
本质:重复、遍历、逐步推进
实现:在Python中用循环结构(for/while)实现,不停更新变量,直到满足结束条件。
斐波那契数列——Python(迭代法)
自定义函数基本格式:
函数的调用:
函数名(参数)
1、f2=f1=1
2、f1,f2=f2,f1+f2
(等价于f1=1,f2=1,这里是Python中的简写语法)
(等号右边先计算,再赋值,可理解为”数值交换“)
斐波那契数列——Python(迭代法)
利用迭代算法解决问题,有三个关键步骤:
(1)确定迭代变量,如活动2中的f1、f2;
(2)建立迭代关系式;
(3)对迭代过程进行控制,这是编写迭代程序必须考虑的问题,不能让透代过程无休止地重复执行下去。
斐波那契数列——Python(递归)
递归是计算机科学领域中一种重要的计算思维模式。它即是一种抽象表达的手段,也是一种问题求解的重要方法。
直接或间接地调用自身的方法称为递归。可以将递归简单类比为具有相似性重复的事物。
斐波那契数列——Python(递归)
在数学与计算机领域中,递归函数是指用函数自身来定义该函数的方法。如著名的斐波那契数列“1,1,2,3,5,8,13,……”可以递归定义为:
F(n)=
1 (n=1或n=2)
F(n-1)+F(n-2) (n>2)
拓展练习
辗转相除法(欧几里得算法)
辗转相除法(欧几里得算法)求最大公约数
核心原理:对于两个正整数 a,b (a>b):
1、用大数 ÷ 小数,得到余数r
2、把原来的除数当作新被除数,余数当作新除数
3、重复相除取余,直到余数 = 0
4、最后一个不为 0 的除数,就是两数的最大公约数(gcd)
公式简写:
gcd(a,b)=gcd(b, a mod b)
辗转相除法(欧几里得算法)
举例实操
例1:求gcd(108,48)
例2:求gcd(180,75)
gcd(108,48)=12
gcd(180,75)=15
课后拔高
高考(全国卷、地方卷)会考斐波那契数列,主要以“递推背景、程序框图、实际应用、性质小题”形式出现,不算超纲,属于数列/算法的文化背景题。
2009 福建卷 理科数学 填空真题
五位同学围成一圈依序循环报数,规定:
①第一位同学首次报出的数为1,第二位同学首次报出的数也为1,之后每位同学所报出的数都是前两位同学所报出的数之和;
②若报出的数为3的倍数,则该同学拍手一次。
已知甲同学第一个报数,当五位同学依序循环报到第100个数时,甲同学拍手的总次数为?
(整除性)
考点:奇偶/整除周期(斐波那契被3整除周期为4)
THANK YOU
$