动态规划的算法启蒙---斐波那契数列

斐波那契数列(概念不介绍了,都点进来了,默认都有基础)

##方法一:递归

后面的项依赖前面的项

每一项都在不停的调用自身,递归最重要的就是找到终止条件

```js

function fib(n) {

console.log(n)

if(n == 0) return 0

if(n == 1) return 1

return fib(n-1) + fib(n-2)

}

```

以40为例,通过打印可以看到递归开销非常大(100直接就停不下来了),可以用动态规划来优化

##方法二:动态规划1.0

计算机有两种开销:时间和空间

缓存 --- 空间换时间

用数组直接存储前面项的计算结果

```js

function fib(n) {

console.log(n)

let arr = []

if(n == 0) return 0

if(n == 1) return 1

for(let i = 2;i<=n;i++){

arr[i] = arr[i-1] + arr[i-2]

}

return arr[n]

}

```

不够不够,继续优化

使用数组其实对整个内存的影响也很大

用变量 --- 做原地编辑,不使用额外的空间

动态规划2.0

```js

function fib(n){

if(n <= 1) return n

let prev = 0,current = 1,next

for(let i = 2;i<=n;i++){

next = prev + current

prev = current

current = next

}

return current

}

```

ok!

拓展

webssembly

基于typescript

飞书文档、在线画板。追求性能

画布不会直接用canvas

而是canvaskit - skia - WebAssembly

上面的算法案例,如果用webssembly+递归,时间会非常快,通常不到1ms

相关推荐
NAGNIP7 小时前
面试官:给我讲一下卷积吧!
算法·面试
2401_831824967 小时前
高性能计算集群部署
开发语言·c++·算法
NAGNIP8 小时前
一文搞懂卷积神经网络!
算法·面试
菜鸟小九8 小时前
hot100(91-100)
数据结构·算法·排序算法
add45a8 小时前
C++代码移植性设计
开发语言·c++·算法
ccLianLian8 小时前
leetcode-hot100
算法·leetcode·职场和发展
qq_148115378 小时前
分布式系统容错设计
开发语言·c++·算法
m0_560396478 小时前
C++中的享元模式
开发语言·c++·算法
左左右右左右摇晃8 小时前
数据结构——数组
数据结构·笔记·算法
nainaire8 小时前
速通LeetCode hot100——(1~9 哈希,双指针,滑动窗口)
c++·笔记·算法·leetcode