暑期前端訓練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.pswp.cn/bicheng/85396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85396.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙網絡編程系列54-倉頡版實現Smtp郵件發送客戶端

1. SMTP郵件發送客戶端 在本系列的第4篇文章《鴻蒙網絡編程系列4-實現SMTP郵件發送客戶端》中&#xff0c;基于ArkTS語言在API9環境下使用TCPSocket對象演示了SMTP客戶端的實現&#xff0c;并且通過騰訊郵件服務器執行了實際的郵件發送。不過&#xff0c;在2024年末&#xff0…

【慧游魯博】【12】UI美化·圖標選擇與變換·動態交互·格式定義

文章目錄 圖標設計迭代過程初始版本問題分析優化措施 游覽畫卷美化原因當前效果展示美化步驟(1) 代碼修改結構優化CSS&#xff08;優化樣式&#xff09; (2) 圖標選擇&#xff08;4種方案&#xff09;(3) 交互優化 版本一版本二1. 修改HTML結構2. 新增CSS樣式色彩控制技術性能優…

IMU介紹

IMU(Inertial Measurement Unit,慣性測量單元)是一種基于慣性原理的傳感器,通過測量物體的加速度和角速度來獲取運動狀態信息。以下從技術原理、核心組件、應用場景及關鍵指標等方面展開詳細解析: 一、IMU的技術原理與核心組件 1. 工作原理 慣性力學基礎:利用牛頓第二定…

MOS管和比較器

目錄 前言一、前置器件復習使用1.比較器工作特性2.光電二極管3.紅外出水水龍頭4.溫控風扇工作原理 二、MOS管1.前置1.1 增強型MOS管1.2 耗盡型MOS管1.3 四種1.4 比較 2.基本結構3.導通條件4.開關電路的設計方法5.寄生電容問題6.寄生二極管不能忽略7.Nmos管做電源開關的注意事項…

從代碼學習深度強化學習 - Double DQN PyTorch版

文章目錄 前言理論篇:為什么需要 Double DQN?代碼實現篇:構建一個 Double DQN 智能體2.1 項目設置與輔助函數2.2 環境 (Environment)2.3 DQN 的核心組件2.3.1 Replay Buffer (經驗回放池)2.3.2 Q-Network (Q網絡)2.3.3 The Double DQN Agent (Double DQN 智能體)訓練與結果3…

四非鼠鼠計算機專業的保研分享

四非鼠鼠的計算機專業保研分享 1.前言 鼠鼠的本科學校是一所不怎么出名的四非院校&#xff0c;專業是計算機科學與技術。在寫下這篇文章時&#xff0c;鼠鼠并不是為了炫耀什么&#xff0c;而是想把自己在保研路上的一些踩坑經歷分享出來&#xff0c;尤其是寫給那些和我一樣&a…

【C++詳解】STL-vector使用底層剖析和實現

文章目錄 vector介紹vector和string的區別補充知識initializer_listemplace_back結構化綁定 vector的使用構造析構遍歷修改insertfind流插入/流提取vector\<vector>(楊輝三角) vector模擬實現淺品STL源碼構造函數拷貝構造多參數構造迭代器區間構造n個val初始化swapoperat…

MySql升級安裝、socket 及密碼重置

升級 項目需要使用Mysql8.0, 查看自己的ubuntu22.04上mysql版本為5.7&#xff0c; 使用以下命令自動升級到8.0版本。 sudo apt install Mysqlsock錯誤&#xff1a; Can’t connect to local MySQL server through socket 運行mysql -u -p 報以下錯誤&#xff1a; ERROR 200…

Python網絡爬蟲技術:從入門到實戰

在當今數字化時代&#xff0c;網絡爬蟲技術已經成為數據挖掘和信息收集的重要工具。通過網絡爬蟲&#xff0c;我們可以高效地從互聯網上獲取大量有價值的數據&#xff0c;用于數據分析、市場研究、學術研究等多種場景。本文將帶你從零開始&#xff0c;了解Python網絡爬蟲的基本…

偏微分方程初值問題求解

題目 問題 2. (a) u t + 3 u x ? 2 u y = x ; u t + x u x + y u y = x ; u_t + 3u_x - 2u_y = x; \quad u_t + xu_x + yu_y = x; ut?+3ux??2uy?=x;ut?+xux?+yuy?=x; u t + x u x ? y u y = x ; u t + y u x + x u y = x ; u_t + xu_x - yu_y = x; \quad u_t + yu_…

【專業梳理】PMP知識體系,以SIPOC流程圖為核心的質量工具擴展

??1. SIPOC流程圖:質量管理的起點?? SIPOC(Supplier-Input-Process-Output-Customer)是六西格瑪和流程管理中的核心工具,用于定義和優化跨職能流程。在PMBOK中,它與質量管理知識領域(尤其是質量規劃、質量保證)緊密關聯: ??質量規劃??:通過SIPOC明確流程邊界…

OpenCV指定pid和vid通過MSMF打開攝像頭

在基于OpenCV的項目中&#xff0c;實際開發過程會面臨設備上存在多個攝像頭&#xff0c;需要指定攝像頭的pid和vid打開攝像頭。在OpenCV通過MSMF打開攝像頭時&#xff0c;需要傳入攝像頭的index&#xff0c;因此需要在打開該攝像頭前需要找出攝像頭的index&#xff0c;下面給出…

STM32F103ZET6系統啟動過程

STM32F103ZET6系統啟動過程 一、概述 STM32F103ZET6啟動過程指硬件選擇啟動模式后,執行固件程序之前的一系列動作。對于系統存儲器模式,系統執行Bootloader程序升級狀態,檢測數據進行串口升級;對于內部Flash模式,系統執行啟動文件,設置堆棧大小,配置系統時鐘,最終調用…

[Data Pipeline] Kafka消息 | Redis緩存 | Docker部署(Lambda架構)

第七章&#xff1a;Kafka消息系統&#xff08;實時流處理&#xff09; 歡迎回到數據探索之旅&#xff01; 在前六章中&#xff0c;我們構建了強大的**批量處理流水線**。 通過Airflow DAG&#xff08;批量任務編排&#xff09;協調Spark作業&#xff08;數據處理&#xff09;…

jquery 賦值時不觸發change事件解決——仙盟創夢IDE

一、傳統方法jquey change $(#village_id).trigger(change);$("#village_id").val(99);$("#village_id").change(); 不生效 二、傳統方法jquey $(#village_id).trigger(change); 四、傳統方法jquey <input type"text" /> <button…

Android | 簽名安全

檢驗和簽名 校驗開發者在數據傳送時采用的一種校正數據的一種方式&#xff0c; 常見的校驗有:簽名校驗(最常見)、dexcrc校驗、apk完整性校驗、路徑文件校驗等。 通過對 Apk 進行簽名&#xff0c;開發者可以證明對 Apk 的所有權和控制權&#xff0c;可用于安裝和更新其應用。…

Android14 耳機按鍵拍照

在相機拍照預覽界面 通過耳機按鍵實現拍照功能 耳機按鍵定義 frameworks/base/core/java/android/view/KeyEvent.java public static final int KEYCODE_HEADSETHOOK 79;相機界面 拍照邏輯 DreamCamera2\src\com\android\camera\PhotoModule.java Override public bool…

【AI作畫】第2章comfy ui的一般輸入節點,文本框的類型和輸入形式

目錄 CLIP文本編碼器 條件輸出和文本輸出 轉換某一變量為輸入 展示作品集 在默認的工作流之外&#xff0c;我們如何自己添加節點呢&#xff1f; 一般我們用到的sampler采樣器在“鼠標右鍵——添加節點——采樣——K采樣器” 我們用的clip文本編碼器在“鼠標右鍵——添加節…

vue3仿高德地圖官網路況預測時間選擇器

<template><div class"time-axis-container"><div class"time-axis" ref"axisRef"><!-- 刻度線 - 共25個刻度(0-24) --><divv-for"hour in 25":key"hour - 1"class"tick-mark":class&…

ZArchiver:高效解壓縮,輕松管理文件

在數字時代&#xff0c;文件的壓縮與解壓已成為我們日常操作中不可或缺的一部分。無論是接收朋友分享的大文件&#xff0c;還是下載網絡資源&#xff0c;壓縮包的處理都極為常見。ZArchiver正是一款為安卓用戶精心打造的解壓縮軟件&#xff0c;它以強大的功能、簡潔的界面和高效…