斐波那契数列(概念不介绍了,都点进来了,默认都有基础)
##方法一:递归
后面的项依赖前面的项
每一项都在不停的调用自身,递归最重要的就是找到终止条件
```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