斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
一、循环法:
// n 太大会溢出,可以使用数据位更宽的数据类型
func fib(n int) int {
if n == 1 || n == 2 {
return 1
}
f1 := 1
f2 := 1
res := 0 //存放结果
for i := 3; i <= n; i++ {
res = f1 + f2
f2 = f1
f1 = res
}
return res
}
时间复杂度:O(n)
空间复杂度:O(1)
二、递归法:
根据递推公式:F(n)=F(n - 1)+F(n - 2)可直接得出
func fib(n int) int {
if n < 2 {
return n
}
return fib(n-1) + fib(n-2)
}

时间复杂度:因为成二叉树形式 ,所以时间复杂度为O(2^n)
空间复杂度:树约有n-1层,所以空间复杂度为O(n)
三、动态规划法:
- 确定 dp数组以及下标的含义:dp[i] 的定义为:第 i 个数的斐波那契数值是 dp[i]
- 确定递推公式:题⽬已经把递推公式直接给我们了:状态转移⽅程 dp[i] = dp[i - 1] + dp[i - 2]
- 初始化dp数组: dp[0] = 0, dp[1] = 1
- 确定遍历顺序: dp[i] 是依赖 dp[i - 1] 和 dp[i - 2] ,所以遍历的顺序是从前到后遍历
func fib(n int) int {
if n < 2 {
re

本文介绍了斐波那契数列(又称兔子数列)的五种计算方法,包括循环法、递归法、动态规划法、快速矩阵幂以及通项公式。循环法和动态规划法时间复杂度均为O(n),但动态规划法通过滚动数组可优化空间复杂度至O(1)。递归法的时间复杂度为O(2^n),而快速矩阵幂利用矩阵乘法和快速幂算法,能在O(logn)的时间内求解。通项公式通过解特征方程得出,提供了另一种求解思路。
最低0.47元/天 解锁文章
4234

被折叠的 条评论
为什么被折叠?



