📜  递归斐波那契 (1)

📅  最后修改于: 2023-12-03 15:28:22.707000             🧑  作者: Mango

递归斐波那契

什么是斐波那契数列?

斐波那契数列是一串数列,其中每个数都是前两个数的和。数列从0和1开始,后续的数列依次为1,2,3,5,8,13,21……

斐波那契数列在数学上有很多特殊的性质,被广泛用于金融学、自然科学、计算机科学等领域。

递归实现斐波那契数列

递归实现斐波那契数列是一种简单而又直观的实现方式。这种方式的原理是利用函数调用自身的特性,不断地将计算转移给下一级函数,直到计算完成。

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

这段代码其实非常简单,可以作如下解释:

  1. 定义一个名为fib的函数,其形参为n
  2. 如果n为0,返回0
  3. 如果n为1,返回1
  4. 如果n大于1,返回fib(n-1) + fib(n-2),即调用自身

这种实现方式的优点是代码简单,易于理解和实现。但是它也有自己的缺点,最主要的是时间复杂度非常高,随着n的增大计算时间也增长得非常快。

优化斐波那契数列

针对递归实现斐波那契数列的主要缺点,我们可以进行优化。优化主要的思想是避免重复计算,因为斐波那契数列中有很多计算都是重复的。如果我们能够将这些重复计算存储下来,那么计算速度将会大大提高。

下面是一种采用动态规划思想的实现方式:

def fib(n):
    if n == 0:
        return 0
    tmp = [0] * (n+1)
    tmp[1] = 1
    for i in range(2, n+1):
        tmp[i] = tmp[i-1] + tmp[i-2]
    return tmp[n]

这段代码其实也非常简单,可以作如下解释:

  1. 定义一个名为fib的函数,其形参为n
  2. 如果n为0,返回0
  3. 定义一个长度为n+1的数组tmp,所有元素初始值为0,tmp[1]为1
  4. 从i=2开始循环,对于每个i,计算tmp[i] = tmp[i-1] + tmp[i-2]
  5. 最终返回tmp[n]

这种实现方式的时间复杂度为O(n),比递归实现的O(2^n)要高效得多。在实际应用中,我们应该尽量避免使用递归实现斐波那契数列,而采用类似于上述的动态规划实现方式。