首頁  >  文章  >  web前端  >  如何理解 JavaScript 中的遞迴?

如何理解 JavaScript 中的遞迴?

PHPz
PHPz轉載
2023-08-29 19:25:07687瀏覽

如何理解 JavaScript 中的递归?

什麼是遞迴?

遞歸一詞來自recurring,意思是一次又一次地回到過去。遞歸函數是透過一步步改變輸入來一次又一次地呼叫自身的函數。這裡,將輸入改變一級意味著將輸入減少或增加一級。

每當遞歸函數達到基本條件時,它就會停止自身的執行。讓我們透過一個例子來理解什麼是基本條件。例如,我們需要求一個數的階乘。我們透過將輸入減 1 來呼叫階乘函數,並且每當輸入達到 1 時就需要停止。因此,這裡 1 作為基本條件。

文法

使用者可以使用下面的語法來理解 JavaScript 中的遞歸。

function recur(val) {
   if (base condition) {
      return;
   }
   
   // perform some action
   
   // decrease the value of val by one step
   return recur(newVal);
}

在上面的語法中,使用者可以觀察到當基本條件變成 true 時我們傳回 null 以停止函數的執行。如果基本條件為 false,我們將使用輸入值執行某些操作,並使用新的參數值再次呼叫 recur() 函數。

現在,讓我們來看看遞歸的各種範例。在這裡,我們將學習首先使用 for 迴圈實作迭代演算法,然後將其轉換為遞歸方法。

範例 1(使用 for 迴圈求 1 到 n 個數字的和)

在下面的範例中,我們編寫了 sumOfN() 函數來取得 1 到 N 個數字的總和。我們使用 for 迴圈進行了 N 次迭代,並且在每次迭代中,我們將 I 的值新增到 sum 變數中。

最後回傳sum變數的值。

<html>
<body>
   <h3>Using the <i> iterative approach </i> to find sum of n numbers in JavaScript</h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      
      // function to find the sum of n numbers using an iterative approach
      function sumOfN(n) {
         let sum = 0;
         for (let i = n; i >= 1; i--) {
            sum += i;
         }
         return sum;
      }
      content.innerHTML += "The sum of 1 to 10 numbers is " + sumOfN(10) + "<br>";
      content.innerHTML += "The sum of 1 to 20 numbers is " + sumOfN(20) + "<br>";
   </script>
</body>
</html>

在上面的範例中,我們使用迭代方法來求 N 個數字的總和。現在,我們將使用遞歸方法來做同樣的事情。

範例 2(使用遞迴函數求 1 到 n 個數字的和)

sumOfN() 函數是下面範例中的遞迴函數。我們透過將參數的值減 1 來重複呼叫 sumOfN() 函數。 sumOfN(N1) 傳回 N-1 個數字的總和,我們將 N 加到它以獲得 N 個數字的總和。每當 N 的值變為 1 時,它就會傳回 1,這作為停止函數執行的基本條件。

<html>
<body>
   <h3>Using the <i> recursive approach </i> to find sum of n numbers in JavaScript</h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      
      // function to find the sum of n numbers using a recursive approach
      function sumOfN(n) {
         
         // base condition
         if (n == 1) {
            return 1;
         }
         
         // call function recursively by decreasing the value of n by 1.
         return n + sumOfN(n - 1);
      }
      content.innerHTML += "The sum of 1 to 10 numbers is " + sumOfN(10) + "<br>";
      content.innerHTML += "The sum of 1 to 20 numbers is " + sumOfN(20) + "<br>";
   </script>
</body>
</html>

讓我們來了解上面的遞歸函數是如何運作的。下面,使用者可以逐步了解遞歸函數呼叫是如何發生的。

sumOfN(5);
return 5 + sumOfN(4);
   return 4 + sumOfN(3);
      return 3 + sumOfN(2);
         return 2 + sumOfN(1);
            return 1;
         return 2 + 1;
      return 3 + 3;
   return 4 + 6; 

範例 3(合併陣列所有字串的迭代方法)

在下面的範例中,我們建立了字串陣列。我們建立了 mergeString() 函數來將陣列的所有字串合併為一個字串。我們使用 for 迴圈遍歷數組,並將所有字串一一合併到「str」變數中。

<html>
<body>
   <h3>Using the <i> iterative approach </i> to merge all strings of the array in JavaScript</h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      
      // function to merge all strings of the array using for loop
      function mergeString(arr) {
         let str = '';
         for (let i = 0; i < arr.length; i++) {
            str += arr[i];
         }
         return str;
      }
      let arr = ['I', ' ', 'am', ' ', 'a', ' ', 'programmer'];
      content.innerHTML += "The original array is: " + arr + "<br>";
      content.innerHTML += "After merging all strings of the array into the single string is " + mergeString(arr) + "<br>";
   </script>
</body>
</html>

範例 4(合併陣列所有字串的遞歸方法)

在下面的範例中,我們已將 mergeString() 函數轉換為遞歸函數。我們取得數組的第一個元素,並將其與 mergeString() 函數的傳回結果合併。 mergeString() 函數傳回合併後的最後 n-1 個陣列元素。此外,我們使用 slice() 方法從陣列中刪除第一個元素。

當數組中只剩下一個元素時,它會傳回相同的元素,該元素作為基本條件。

<html>
<body>
   <h3>Using the <i> Recursive approach </i> to merge all strings of the array in JavaScript</h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      
      // function to merge all strings of the array using recursion
      function mergeString(arr) {
         
         // based condition
         if (arr.length == 1) {
            return arr[0];
         }

         // remove the first element from the array using the slice() method.
         return arr[0] + " " + mergeString(arr.slice(1));
      }
      let arr = ["I", "am", "a", "web", "developer"];
      content.innerHTML += "The original array is: " + arr + "<br>";
      content.innerHTML += "After merging all strings of the array into the single string is " + mergeString(arr) + "<br>";
   </script>
</body>
</html>

使用者應該使用哪一種方法,迭代還是遞歸?

主要問題是哪一種方法比較好,迭代或遞歸,以及使用者應該使用哪一種方法。

在某些情況下,迭代方法比遞歸方法更快。此外,遞歸在迭代過程中需要更多的記憶體。對於某些演算法(例如分治法),遞歸更有用,因為我們需要使用遞歸方法來編寫更少的程式碼。此外,如果遞歸方法中未觸發基本條件,使用者可能會面臨記憶體洩漏問題。

如果我們可以將程式碼分解成更小的部分,我們應該使用遞歸方法,而為了提高程式碼的效能,我們應該使用迭代方法。

以上是如何理解 JavaScript 中的遞迴?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除