斐波那契数列又称为黄金比数列,它的每一项都是前两项的和。
起始的两项一般是0和1或1和2,此处以0和1为起始项。
0、1、1、2、3、5、8、13、21、34、……
用python实现时,有三种方式,分别是个数,最大值和递归。其中递归又分为普通递归和尾递归。
一、个数方式
给出一个数n,打印前n项斐波那契数。
首先定义一个方法,接收一个参数num,表示数列的前n个
def countF(num):
根据要求,需要2个变量来保存数列中的前2项,初始时2个变量分别代表0和1
a, b = 0,1
再定义一个list,存放前n项数
Flist = []
如果num<1,没有意义,直接返回false
if num < 1:
return False
当num等于1时,无法求和得出下一项,所以先判断num是否>0,如果是,则list中必定有第一项0,将0添加到列表
if num > 0:
Flist.append(a)
当num>1时,可以进行求和运算,列表中至少需要两项,所以先将第二项1添加入列表中
if num > 1:
Flist.append(b)
添加b后,当前列表中已有2项,0和1,此时可以根据num进行求和,当求前n项时,需要进行n-2次求和运算,由此得出需要遍历n-2次
for i in range(num - 2):
将和赋值给第二项b,将b赋值给第一项
b, a = a+b, b
然后将b添加到list中
Flist.append(b)
最终返回改list
return Flist
详细代码如下:
1 def countF(num):
2 '''
3 :param num: 要显示的数列元素个数
4 :return: 数列
5 '''
6 a, b = 0,1
7 Flist = []
8 if num < 1:
9 return False
10 if num > 0:
11 Flist.append(a)
12 if num > 1:
13 Flist.append(b)
14 for i in range(num - 2):
15 b, a = a+b, b
16 Flist.append(b)
17 return Flist
18
19 if __name__ == "__main__":
20 print(countF(5))
二、最大值方式
最大值方式是给出一个数,求该数以内的斐波那契数列列表,比如数字10,则10以内的列表为0、1、1、2、3、5、8
同理,依旧是先定义一个函数,接收一个数值
def LessthanF(num):
定义前2项,分别初始化为0和1,并定义一个空list,存放数列
a, b = 0, 1
Flist = []
由于数列中最小为0,所以如果num<0,则无意义,返回false
if num < 0:
return False
当num>=0时,必定有第一项0,所以将0添加到list中
if num >= 0:
Flist.append(a)
当num==1时,1以内的数列为0,1,1。满足了求和条件,所以先将第二项1添加至list中,再进行求和运算
if num >= 1:
Flist.append(b)
for i in range(num):
b, a = a+b, b
当b>num时,超出了num,则退出求和操作
if b > num:
break
否则就把b存放到list中
Flist.append(b)
最终返回该list
return Flist
详细代码如下:
def LessthanF(num):
'''
:param num: 数列最大值小于等于num
:return: 数列
'''
a, b = 0, 1
Flist = []
if num < 0:
return False
if num >= 0:
Flist.append(a)
if num >= 1:
Flist.append(b)
for i in range(num):
b, a = a+b, b
if b > num:
break
Flist.append(b)
return Flist
if __name__ == "__main__":
print(LessthanF(4))
三、递归方式
定义一个函数,接收一个数字num,表示数列的第n项,函数返回第n-1项+第n-2项的和。当num为0或1时,表示数列最开始的前2项,则返回num本身
def recursion(num):
'''递归'''
if num < 2:
return num
return recursion(num-1) + recursion(num-2)
再定义一个函数,入参为num,表示数列的前n项,定义一个空list,存放前n项
def ListF1(num):
Flist = []
根据num开始遍历,前num项需遍历num次
for i in range(0,num):
将第n项添加到list中
Flist.append(recursion(i))
遍历完成后返回该list
return Flist
详细代码如下:
1 def recursion(num):
2 '''递归'''
3 if num < 2:
4 return num
5 return recursion(num-1) + recursion(num-2)
6
7 def ListF1(num):
8 Flist = []
9 for i in range(0,num):
10 Flist.append(recursion(i))
11 return Flist
12
13 if __name__ == "__main__":
14 print(ListF1(5))
四、尾递归方式
尾递归方式与递归比较相似,但不同点是递归返回的是函数与函数之间的算术操作,尾递归返回的是该函数,运算操作放在了参数中
详细代码如下:
1 def tailrecursion(num,a=0, b=1):
2 '''尾递归'''
3 if num == 0:
4 return a
5 return tailrecursion(num-1, b, a+b)
6
7 def ListF2(num):
8 Flist = []
9 for i in range(0,num):
10 Flist.append(tailrecursion(i))
11 return Flist
12
13 if __name__ == "__main__":
14 print(ListF2(5))
五、生成器方式
首先需要先定义一个生成器函数,这个函数会返回数列中的每一个值
代码如下:
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a+b fib = fibonacci() for i in range(10): print(next(fib))