针对递归函数进行优化的方案
时间:2019-11-11
本文章向大家介绍针对递归函数进行优化的方案,主要包括针对递归函数进行优化的方案使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
相信递归函数大家都写过,下面就是个典型的递归函数:
function fibonacci(n) { return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1); }
但是像这样的递归函数有个很明显的问题,每次调用的时候都需要重新计算结果,这样过深的递归就会占有过多内存导致堆栈溢出。
针对这种情况,我们可以使用缓存策略来缓存中间的计算值。
var fibonacci = function(){ let cache = {}; return function(n){ if(!cache[n]){ cache[n] = n < 2 ? n : fibonacci(n-2) + fibonacci(n-1); } return cache[n]; } }();
上述方法使用了一个闭包,声明了一个局部变量cache来保存缓存中间的计算值,大家可以在控制台试一下递归层级比较多的时候性能已经得到了很大的提升。
这里解释一下,为什么用的是cache = {},而不是cache = [],是因为cache = {}的性能会更高一些(其实使用场景也会多一些,key不用局限于数字),如果设置了cache = [],在设置cache[100]的时候,目标其实只是想设置一个key为100的value,结果数组会将0-99都会被初始化为empty,而设置对象的话就只会设置key为100的这一项。
这里再包装一层,作为一个用于递归函数的通用缓存函数。
let memoize = function(func) { let cache = {}; return function(key) { if (!cache[key]){ cache[key] = func.apply(this, arguments); } return cache[key]; } } let fibonacci = memoize(function(n) { return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1); });
总结:其实原理很简单,就是声明一个变量来缓存中间值,其实看很多框架的源码,都使用了这个方法来提升性能,我们平常在维护自己的组件库或者写业务代码时也可以用上去。
原文地址:https://www.cnblogs.com/luoyanan/p/11824843.html
- 关于ssh命令的几个使用小技巧(r11笔记第27天)
- Golang语言社区--消息触发服务器启动基础模块分享
- NYOJ------汉诺塔(一)
- HDUOJ----Coin Change
- Golang语言社区--列出目录和遍历目录的方法
- HDUOJ-------单词数
- insert导致的性能问题大排查(r11笔记第26天)
- NYOJ-----最少乘法次数
- nyOJ-----韩信点兵
- HDUOJ-----A == B ?
- 用Oracle的眼光来学习MySQL 5.7的sys(上)(r11笔记第24天)
- Golang下通过syscall调用win32的api
- NYOJ----蛇形填数
- Golang语言 syscall 例子
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP 文件上传限制问题
- Flutter permission_handler 权限插件的使用详解
- Flutter使用JsBridge方式处理Webview与H5通信的方法
- flutter 怎么实现app整体灰色效果
- 解决android studio中使用monitor工具无法打开data文件夹问题
- Android安装应用 INSTALL_FAILED_DEXOPT 问题及解决办法
- php简单检测404页面的方法示例
- thinkPHP3.2使用RBAC实现权限管理的实现
- Flutter以两种方式实现App主题切换的代码
- PHP中非常有用却鲜有人知的函数集锦
- PHP针对redis常用操作实例详解
- thinkPHP5使用Rabc实现权限管理
- PHP实现cookie跨域session共享的方法分析
- VS Code开发React-Native及Flutter 开启无线局域网安卓真机调试问题
- Laravel5.4简单实现app接口Api Token认证方法