斐波那契数列又称为黄金比数列,它的每一项都是前两项的和。

起始的两项一般是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))