一.认识斐波纳茨数列
斐波纳茨数列指的是这样一个数列:1、1、2、3、5、8、13、21、……
斐波纳茨数列又因数学家列昂纳多·费波纳茨以兔子繁殖为例子而引入,故又称为“兔子数列”。一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔民数共有两对;三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;------依次类推可以列出下表:经过月数:—1—2—3—4—5—6—7—8—9—10—11—12兔子对数:—1—1—2—3—5—8–13–表中数字1,1,2,3,5,8---构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。这个特点的证明:每月的大兔子数为上月的兔子数,每月的小兔子数为上月的大兔子数,即上上月的兔子数,相加。
斐波纳茨数列是很有趣的数列,如还想深入了解,请自行百度。
二.用python实现计算费波纳茨数列
1.计算斐波纳茨数列的第n位是多少
方法1:使用for循环
def Fib(n):
if n==1 or n==2:
return 1
a=1
b=1
for i in range(3,n+1):
temp=a
a=b
b=a+temp
return b
方法2:使用递归的方式
def Fib(n):
if n==1 or n==2:
return 1
return Fib(n-1)+Fib(n-2)
>>> Fib(1000) #运用一下
RecursionError: maximum recursion depth exceeded in comparison
>>> Fib(0) #同Fib(1000),因为没有递归出口,一直在压栈
RecursionError: maximum recursion depth exceeded in comparison
为什么会报错呢?很简单,我们都知道子程序调用(call)需要压栈出栈,如果无限递归调用,那么就一直压栈,没有出栈,内存消耗也越来愈多。python比较高级,直接抛出这个异常,结束程序运行。
栈是数据结构的概念。可以把栈比成一堆叠放的盘子,出栈就是取出最顶端的盘子,压栈就是把外面的盘子放到顶端。除此之外栈不能有其它操作。因此它和队列一样是受限的线性表。
我理解的意思是如要计算Fib(1000)则要先知道Fib(999)+Fib(998)以此类推,直到找到递归出口,在还未找到递归出口时,之前被调用的函数一直放在内存里,导致内存越来越多,最后抛出异常。如Fib(5)就不会报错,再还未抛出异常时Fib(5)就被计算出来了,然后按照Fib(1)、Fib(2)的顺序出栈。
2.将数放到一个list里
方法1:
def fib(n):
result=[]
if n==1:
return [1]
if n==2:
return [1,1]
a=1
b=1
for i in range(1,3):
result.append(1)
for i in range(3,n+1): #或者range(n-2)
temp=a
a=b
b=a+temp
result.append(b)
return result
>>> fib(5)
[1, 1, 2, 3, 5]
方法2
Fib_list=[]
for i in range(10):
if i==0 or i==1:
Fib_list.append(1)
else:
Fib_list.append(Fib_list[i-1]+Fib_list[i-2])
>>> print(Fib_list)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
三.综上所述可以看出:
1、递归的特点
递归算法是一种直接或间接调用自身算法的过程,在计算机编程中,递归算法对解决一大类问题是十分,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。
2、递归的要求
递归算法所体现的“重复”一般有三个要求:
(1)每次调用在规模上都有所缩小(通常是减半)
(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
(3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。