如何用 JavaScript 寫簡單的 Memoization 函數程式碼?
記憶化是提高函數效能的最佳化技術。在我們開始記憶技術之前,讓我們使用下面的範例來了解為什麼我們需要它。
範例(尋找斐波那契數的簡單方法)
在下面的範例中,我們實作了簡單的方法來找出第 n 個斐波那契數。我們使用遞歸方法來找出第 n 個斐波那契數列。
<html> <body> <h3>Finding the nth Fibonacci using recursive approach number in JavaScript</h3> <p>Enter the number to find the nth Fibonacci number.</p> <input type = "number" id = "fib"> <br> <div id = "content"> </div> <br> <button onclick = "executeFunc()"> Submit </button> <script> let content = document.getElementById('content'); // function to write the fibonacci series function findFib(n) { if (n <= 1) return n; return findFib(n - 1) + findFib(n - 2); } function executeFunc() { let n = document.getElementById('fib').value; content.innerHTML = "The " + n + "th fibonacci number is " + findFib(n); } </script> </body> </html>
上面的範例對於小於1000 的小輸入值來說效果很好,但是當我們輸入範圍104 的輸入值時,它需要比平常更多的時間,並且對於範圍10的輸入6,由於記憶體越界導致瀏覽器崩潰。
我們可以使用記憶技術來優化上面的程式碼,它允許我們儲存先前計算的結果。例如,要找出第 4 個斐波那契數,我們需要找出第 3 和第 2 個斐波那契數。同樣,要找到第三個斐波那契數,我們必須找到第二個和第一個斐波那契數。因此,這裡我們計算了第二個斐波那契數兩次。
現在,假設您想要找到第 n 個大值的斐波那契數列,您可以想想它需要多少重複。因此,出於最佳化目的,我們可以第一次計算第二個斐波那契數並將其儲存在臨時變數中。之後,當我們需要再次計算第二個斐波那契數時,我們可以從陣列中存取它,從而使程式碼更有效率。
此外,將先前計算的結果儲存在陣列中以供以後使用也是記憶化。
文法
使用者可以依照下面的語法來實現記憶第n個斐波那契數。
if (temp[n]) return temp[n]; if (n <= 1) return n; return temp[n] = findFib(n - 1, temp) + findFib(n - 2, temp);
在上面的語法中,我們首先檢查‘temp’物件中是否已經存在第n個斐波那契數,然後傳回該值;否則,我們計算它的值並將礦石加到臨時物件中。
方法
步驟 1 – 使用 if 語句檢查臨時物件中是否存在 n 的結果。如果是,則傳回先前計算的值。
步驟 2 – 如果 n 小於或等於 1,則傳回 1 作為遞歸函數的基本情況。
第 3 步 – 計算 n-1 和 n-2 斐波那契數,將它們相加並將它們儲存在臨時物件中以供以後使用。
第 4 步 – 將第 n 個斐波那契數儲存後回到暫存物件。
範例(使用記憶找出第 n 個斐波那契數)
使用記憶技術,我們優化了下面範例中第一個範例的程式碼。我們使用 temp 物件來儲存先前計算的結果。在輸出中,使用者可以觀察到下面的程式碼比第一個範例的程式碼更有效率。
<html> <body> <h3>Finding the nth Fibonacci number using memoization using extra space in JavaScript</h3> <p>Enter the number to find the nth Fibonacci number.</p> <input type = "number" id = "fib"> <br> <div id = "content"> </div> <br> <button onclick = "start()"> Submit </button> <script> let content = document.getElementById('content'); function findFib(n, temp) { if (temp[n]) return temp[n]; if (n <= 1) return n; return temp[n] = findFib(n - 1, temp) + findFib(n - 2, temp); } function start() { let n = document.getElementById('fib').value; content.innerHTML = "The " + n + "th fibonacci number using memoization is " + findFib(n, {}) + "<br>"; } </script> </body> </html>
方法:使用記憶而不使用額外空間
第 1 步 – 將 a 初始化為 0,將 b 初始化為 1。
第 2 步 – 使用 for 迴圈進行 n 次迭代來找出第 n 個斐波那契數。
第 3 步 – 這裡,c 是一個臨時變量,儲存第 (i-1) 個斐波那契數。
第 4 步 – 將 b 變數的值儲存在 a 中。
第 5 步 – 將變數 c 的值儲存在變數 b 中。
範例
下面的範例也是第一個範例的最佳化變體。在第二個範例中,我們使用 temp 物件來儲存先前計算的結果,但在下面的程式碼中,我們使用名為 c 的單一暫存變數。
下面的程式碼是尋找斐波那契數列最有效的方法,因為其時間複雜度為 O(n),空間複雜度為 O(1)。
<html> <body> <h3>Finding the nth Fibonacci number using memoization in JavaScript</h3> <p>Enter the number to find the nth Fibonacci number:</p> <input type = "number" id = "fib"> <br> <div id = "content"> </div> <br> <button onclick = "findFib()"> Submit </button> <script> let content = document.getElementById('content'); // function to write the fibonacci series function findFib() { let n = document.getElementById('fib').value; let a = 0, b = 1, c; if (n == 0) { return a; } for (let i = 2; i <= n; i++) { c = a + b; a = b; b = c; } content.innerHTML += "The " + n + "th Fibonacci number using memoization is " + b; } </script> </body> </html>
在本教程中,我們學習了優化程式碼的記憶技術,使其更加節省時間和空間。使用者可以在第二個和第三個範例中使用不同的演算法看到我們如何最佳化第一個範例的程式碼。
以上是如何用 JavaScript 寫簡單的 Memoization 函數程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...
