javascript memoization递归优化
2024-10-15 20:43:30
memoize优化递归
function createRec(callback, cache) {
cache = cache || []; var rec = function(n) {
(n in cache) || (cache[n] = callback(rec, n));
return cache[n];
} return rec;
}
以Fibonacci数列为例子,如何创建一个优化的递归
var fib = createRec(function(cal, n) {
return cal(n - 1) + cal(n - 2);
}, [0, 1, 1]);
在callback里面我们传入的参数是返回的递归函数和n,函数体内部是递归函数遇到n后的递归规则,cache里面是一些初始值
作用
典型的,我们使用传统的递归计算Fibonacci数列
function fibonacci(n) {// author黄雪良
return n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
}
计算fibonacci(80)……卡死了
但是使用经过优化的算法,可以非常快的算出来
原因很明显,由于缓存的原因1~80每个数都只需要计算一遍,80次计算需要的时间可不长,可是在没有缓存的情况下,每个数都需要重复计算很多遍
更进一步,尾递归
当然,我们还可以用尾递归进行优化
function fibonacci(n, ret1, ret2) {
if (n < 2) {
return ret1;
}
return fibonacci(n - 1, ret2, ret1 + ret2);
}
这个递归中,每次只有一个分支,很明显比原始的递归要优化了很多,而且每次递归都把结果计算出来了,每个数值只需要计算一遍
最新文章
- datetimepicker一个不错的日历android特效
- Hyper-v虚拟机文件VHDX与VHD的格式转换
- cmd chcp命令切换字符格式UTF8
- 两个viewport的故事(第二部分)
- 7——使用TextView实现跑马灯
- C语言栈的实现
- bootstrap 导航栏
- 关于css3中transform的理解(只是改变状态未改变其真正的属性)
- 通过web对.exe程序进行更新和修改
- MySQL_第三方数据库引擎_tokudb
- http/2.0与http/1.1的区别
- Vue的理解:Vue.js新手入门指南----转
- 初始Yarn
- effective c++ 笔记 (41-44)
- 【转】Git命令大全(非常齐全)
- [转] lua 获取本地当月天数
- restclient 访问 springmvc java工程接口
- 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
- HTML5文本
- ssl证书之certbot