斐波那契数列指的是这样一个数列:
1、1、2、3、5、8、13、21、34、……
在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)
即,除前两位数等于1外,后面一个数是前两个数的和;
在python实现斐波那契数列的打印时,会有三种方法
实现代码如下:
# 方法一:直接用递归求斐波那契数列第n个数值
# 该种求法,n越大效率越低,因为每次求值,都会重新把前面的数算一遍
# 每次递归,都会重新创建栈,n较大时很容易爆栈
def feibona(n):
if n < 2:
return n
return feibona(n - 1) + feibona(n - 2)
# 方法二:使用尾递归求斐波那契数列第n个数值
# 该种求法,效率较高
def feibona_tial(n, a, b):
if n == 0:
return a
return feibona_tial(n - 1, b, a + b)
# 方法三:循环求斐波那契数列第n个数值
# 该种求法,效率最高
def feibona_while(n):
a = 0
b = 1
if n == 0:
return a
if n == 1:
return b
for i in range(1, n):
c = a + b
a = b
b = c
return c
if __name__ == '__main__':
for i in range(100):
print(feibona_while(i)) # 循环
for i in range(100):
print(feibona_tial(i, 0, 1)) # 尾递归
for i in range(100):
print(feibona(i)) # 递归
对于以上三种实现方法,运行后很容易就会发现
1.循环实现,效率最高;
2.尾递归实现,效率次之,也较快;
3.递归实现,当数字较大时,速度越来越慢;
这里有必要说一下,并不是所有语言都支持尾递归的,比如python中其实就是不支持尾递归的,
因为对于较大的层数调用,尾递归依然会爆栈,
比如我在调用尾递归时,n=998不会报错,但是n=999时就会爆栈
但是在爆栈层数之前,尾递归比普通递归的效率高很多很多很多;
所以大家在使用,递归、尾递归时,需要酌情考虑,递归层级较低时可以使用尾递归;
能用循环实现的,还是使用循环,逻辑虽然复杂点,但效率仍然不失是最佳的;