Python实现斐波那契数列: 递归、尾递归、循环三种方法的比较

斐波那契数列指的是这样一个数列:
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时就会爆栈


Python实现斐波那契数列: 递归、尾递归、循环三种方法的比较_第1张图片
Y6ZNGGOBG{7O8B9J$3L~J)0.png

但是在爆栈层数之前,尾递归比普通递归的效率高很多很多很多;

所以大家在使用,递归、尾递归时,需要酌情考虑,递归层级较低时可以使用尾递归;
能用循环实现的,还是使用循环,逻辑虽然复杂点,但效率仍然不失是最佳的;

你可能感兴趣的:(Python实现斐波那契数列: 递归、尾递归、循环三种方法的比较)