斐波那契数列
- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…
- 用 JS 计算斐波那契数列的第 n 个值
- 注意时间复杂度
递归思路
- f(0) = 0
- f(1) = 1
- …
- f(n) = f(n - 1) + f(n - 2)
注:会有大量重复运算,时间复杂度O(2^n),不可用
优化
- 不用递归,用循环
- 记录中间结果
- 时间复杂度O(n)
/**
* @description 斐波那切数列
* @author lsr
*/
// /**
// * 斐波那切数列 - 递归 - O(2^n)不可用
// * @param n
// * @returns 结果
// */
// function fibonacci(n: number): number {
// if (n <= 0) return 0
// if (n === 1) return 1
// return fibonacci(n - 1) + fibonacci(n - 2)
// }
/**
* 斐波那切数列 - 循环 O(n)
* @param n
* @returns 结果
*/
export function fibonacci(n: number): number {
if (n <= 0) return 0
if (n === 1) return 1
let n1 = 0 // 记录 n - 2
let n2 = 1 // 记录 n - 1
let res = 0
for (let i = 2; i <= n; i++) {
res = n1 + n2
// 记录中间结果
n1 = n2
n2 = res
}
return res
}
// 功能测试
// const res = fibonacci(10)
// console.log(res)
单元测试
/**
* @description 斐波那切数列 test
* @author lsr
*/
import { fibonacci } from '@/01-algorithm/fibonacci'
describe('斐波那切数列', () => {
it('负数', () => {
const res = fibonacci(-1)
expect(res).toBe(0)
})
it('0', () => {
const res = fibonacci(0)
expect(res).toBe(0)
})
it('1', () => {
const res = fibonacci(1)
expect(res).toBe(1)
})
it('正常情况', () => {
const res1 = fibonacci(2)
expect(res1).toBe(1)
const res2 = fibonacci(3)
expect(res2).toBe(2)
const res3 = fibonacci(10)
expect(res3).toBe(55)
})
})
动态规划
- 把一个大问题,拆解为多个小问题,逐级向下拆解
- 用递归的思路去分析问题,再改为循环来实现
- 算法三大思维:贪心、二分、动态规划