APP下载

Python编程求解斐波那契数列

2020-03-10牟晓东

电脑报 2020年50期
关键词:那契赋值语句

牟晓东

斐波那契(Fibonacci)数列又称“黄金分割数列”,最早是由意大利数学家Fibonacci以兔子繁殖为例引入,因此又称“兔子数列”。这个数列的第0项是0,第1项是1,从第3项开始,每一项均等于前两项之和,即:0,1,1,2,3,5,8,13,21……

1.斐波那契数列的数学解析

一般而言,兔子在出生两个月之后就会有繁殖能力,一对兔子每月能生出一对小兔子。假设兔子不死亡,一年之后会繁殖出多少对兔子?经分析后不难发现,成年兔子的对数符合这样的函数定义:

F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N自然数)

那么下面我们使用Python编程来求解这个数列。

2.递归解法

递归是求解这种数列的常规方法。递归即函数在运行过程中不断地直接或间接调用自身的一种算法,比如在Python中通过“def fib1(n):”来定义fib1()函数,其主体内容为“三分支”结构:前两种(if和elif)通过判断参数n是0还是1来分别对应这个数列的前兩项0和1,二者均通过return语句来返回对应的数值。注意判断条件中的双等号的含义是“等于”,一个等号是“赋值”运算。第三个分支(else)是“return fib1(n-1)+fib1(n-2)”,意思是递归运算返回该项前两项值的和:F(n)=F(n-1)+F(n-2)。

最后使用“print(‘一年之后会繁殖出的兔子对数为:,fib1(12))”来输出运算结果,其中的“fib(12)”作用是调用fib1()函数,参数为12(一年的月数)。保存程序为fibonacci1.py,运行后得到结果是144(如图1)。

3.Python优化解法

Python支持多变量在一行语句中同时赋值的运算,比如“x,y=y,x”,意思是x和y这两个变量的值进行“互换”。对于这种两个变量进行值互换的运算,其他编程语言几乎都是通过第三方变量来“暂存”中间数据的方式来完成的,例如最初有“x=3”和“y=4”两个赋值语句,分别将3和4这两个数据给变量x和y;接着需要再通过三个赋值语句完成x和y数据的互换:“z=x”、“x=y”和“y=z”,意思分别是“将x的值(3)给z”、“将y的值(4)给x”和“将z的值(3)给y”,此时x的值变成4、y的值变成3。

如果使用Python的多变量同时赋值方法来编程,就可以通过“def fib2(n):”来定义fib2()函数。首先通过“a,b = 0,1”语句,实现变量a和b同时被分别赋值0和1,对应斐波那契数列的前两项;接着使用for循环和range()函数“for i in range(n):”,其循环体为“a,b = b,a+b”,意思是将b的值给a、将a+b的值给b,实现之前使用递归算法完成的第三项及之后项的斐波那契数列运算;for循环体结束后,通过“return a”语句将变量a的值返回;最后仍是通过print语句的“fib2(12)”来调用函数计算并输出,保存程序为fibonacci2.py,运行结果仍是144(如图2)。

4.求任意项斐波那契数列

理论上讲,斐波那契数列的值是无穷的,如何使用Python编程来实现输出数列的任意项呢?可以先通过input函数来接收用户从键盘上输入的“要求”,注意一定要使用int()函数将该字符串型数据转换为整数型数据;接着定义fib3()函数,内容与上面的fib2()完全相同,同样是返回a的值;然后使用print语句输出提示信息,再同样是通过for循环加range()函数,循环体内的“print(fib3(i),end=‘ )”是调用fib3()函数,其中的“end=‘ ”作用是控制打印输出的各项Fibonacci数列值之间使用一个空格来分隔(默认是回车)。将程序保存为fibonacci3.py,运行测试,分别尝试输入10、20和50,程序就会根据要求输出斐波那契数列的前10、20和50个数值(如图3),大家不妨一试。

猜你喜欢

那契赋值语句
有趣的斐波那契数列
从斐波那契数列的通项公式谈起
算法框图问题中的易错点
疑似斐波那契数列?
抽象函数难度降 巧用赋值来帮忙
利用赋值法解决抽象函数相关问题オ
斐波那契数列之美
基本算法语句
我喜欢
学生为什么“懂而不会”