当前位置: 首页 > news >正文

暑期前端训练day1

js——记忆函数

2025-06-19
day1

一、记忆函数Ⅰ:

链接:https://leetcode.cn/problems/memoize/?envType=problem-list-v2&envId=GR5hbGen

(1) 题意:给定一个函数,返回一个记忆版的函数,其中你只会包含三个可能输入的函数,sum(a, b) { return a + b};fib(n) = fib(n - 1) + fib(n - 2);fac(n) = n * fac(n - 1);最终希望每次相同的参数都缓存下来。
(2) 题解:可以动态开点,去存map套map,因为三个函数都有不可能为undefined的性质,所以我们可以以undefined为判断条件

code:

function memoize(fn) {let mp = new Map()  function setFn(L, v) {let tmp = mp for(let i = 0; i < L.length; ++ i ) {if(i < L.length - 1) {if(!tmp.get(L[i])) tmp.set(L[i], new Map())tmp = tmp.get(L[i])   continue }// console.log(tmp)tmp.set(L[i], v) }}function get(L) {let tmp = mpfor(let i = 0; i < L.length; ++ i ) {if(tmp.get(L[i]) !== undefined) {tmp = tmp.get(L[i]) }else {return undefined}}return tmp }return function(...args) {const res = get(args) if(res != undefined) return resconst aim = fn(...args)setFn(args, aim) return aim }
}
/** * let callCount = 0;* const memoizedFn = memoize(function (a, b) {*	 callCount += 1;*   return a + b;* })* memoizedFn(2, 3) // 5* memoizedFn(2, 3) // 5* console.log(callCount) // 1 */

二、记忆函数Ⅱ:升级版本,需要适用于所有可能的函数

链接: https://leetcode.cn/problems/memoize-ii/

题解:这里我们可以考虑参数,需要考虑的是有些函数[1, 1, 1], [1], [1, 1]三种不同的参数可以算出不同的值,所以上面的方案已经不适用了,我们可以从参数的特征下手,可以发现参数列表的长度是区分它们的关键,所以我们在用set和get的时候,最前面加入一个参数列表的长度。
还有一个很重要的就是,函数可能会返回undefined,null之类的东西,所以我们需要多记录一个map,来确定我们是否已经开点了。

code:

/*** @param {Function} fn* @return {Function}*/
function memoize(fn) {let mp = new Map()  let st = new Map() function setFn(L, v) {let tmp = mp, stp = st for(let i = 0; i < L.length; ++ i ) {if(i < L.length - 1) {if(!stp.get(L[i])) {tmp.set(L[i], new Map())stp.set(L[i], new Map()) }tmp = tmp.get(L[i])   stp = stp.get(L[i]) continue }// console.log(tmp)tmp.set(L[i], v) stp.set(L[i], true) }}function get(L) {let tmp = mplet stp = st for(let i = 0; i < L.length; ++ i ) {if(stp.get(L[i])) {tmp = tmp.get(L[i])stp = stp.get(L[i])  }else {return "无解"}}return tmp }return function(...args) {const cs = [args.length]cs.push(...args) const res = get(cs) if(res != "无解") return resconst aim = fn(...args)setFn(cs, aim)  return aim }
}/** * let callCount = 0;* const memoizedFn = memoize(function (a, b) {*	 callCount += 1;*   return a + b;* })* memoizedFn(2, 3) // 5* memoizedFn(2, 3) // 5* console.log(callCount) // 1 */
http://www.lqws.cn/news/441703.html

相关文章:

  • SpringBoot扩展——应用Web Service!
  • 【 感知集群】大规模分布式基础设施的AI赋能蓝图
  • 深度学习之目标检测YOLO简介和YOLO v1模型算法流程详解说明(超详细理论篇)
  • Redis
  • 动态规划算法思路详解
  • 【高录用】2025年数字金融,大数据与商业管理国际会议 (DFBBM 2025)
  • 蚀刻效果解释
  • LeetCode | 一文弄懂树:定义、原理、应用与题型分类
  • SpringBoot新闻项目学习day3--后台权限的增删改查以及权限管理分配
  • 算法导论第十九章 并行算法:解锁计算新维度
  • Oracle 数据库性能优化之重做日志(redo)
  • 刘波卸任OPPO法定代表人、经理等职务,段要辉“接棒”
  • FPGA基础 -- Verilog 禁止语句
  • django rest_framework 自定义403 Forbidden错误页面
  • NetworkManager介绍与用法
  • 【Bluedroid】蓝牙启动之 btif_init_ok 流程源码解析
  • 二叉树基本学习
  • “开放原子园区行”太原站:openKylin以开源之力,赋能产业发展
  • Go 运维巡检系统(opsxj)开发与实践
  • 01.线性代数是如何将复杂的数据结构转化为可计算的数学问题,这个过程是如何进行的
  • 前端跨域解决方案(5):websocket
  • SQL注入安全研究
  • JMeter 高阶玩法:分布式压测的技术核心技术要点
  • 容器运行时保护:用Falco构建云原生安全防线
  • Java同步机制四大工具对比
  • 国产USRP X440 PRO:超大带宽、多通道相参同步的旗舰型软件无线电设备
  • 自主学习-《WebDancer:Towards Autonomous Information Seeking Agency》
  • leetcode:461. 汉明距离(python3解法,数学相关算法题)
  • 中国医科大借iMeta影响因子跃升至33.2(中科院1区)东风,凭多组学联合生信分析成果登刊
  • 视觉大语言模型未能充分利用视觉表征