JavaScript 中的递归函数如何工作?

front end technologyjavascriptweb development

本文将教您如何使用递归方法创建 JavaScript 递归函数 - 调用自身的函数。递归过程涉及调用自身。递归函数是那些反复调用自身的函数。递归函数中始终包含停止调用自身的条件。否则,它将继续调用自身。递归函数通常用于将大问题分解为较小的问题。递归函数经常出现在二叉树、图形等数据结构以及二分搜索和快速排序等算法中。

递归函数并不是立即清晰或易于理解的。如果您理解以下语句,您将更快地阅读和理解递归函数。在做其他任何事情之前,您应该始终确定函数的基本情况。将参数发送给函数,以便它可以立即达到基本情况。确定哪些输入将至少调用一次递归函数。

读取和编写递归函数几乎相同。创建一个可以通过其参数访问并具有基本情况的常规函数​​。为函数提供参数,以便它可以直接调用基本情况。传递以下启动递归调用的参数。

让我们看看不同的方法来了解递归在 JavaScript 中的工作原理。

使用递归计算数字的阶乘

正数 n 的阶乘由 − 给出

n 的阶乘 (n!) = 1 * 2 * 3 * 4 *... * n

负数的阶乘不存在。而 0 的阶乘是 1。

语法

以下是递归函数 − 的语法

function recursion() {
   if(condition) {
      recursion();
   } else {
      // 停止调用 recursion()
   }
}
recursion();

示例

在下面的示例中,我们将演示如何在 JavaScript 中使用递归来查找数字的阶乘。我们创建一个带有参数"b"的函数 fact()从主函数中获取一个值为 6 的函数。首先,我们检查数字是否等于 0。如果为真,则程序将返回 1。在 else 语句中,我们将检查 b*fact(b-1),这大致相当于 6*(6-1)。 在下一个递归中,它将是 5*(5-1),依此类推。这样,函数将继续查找数字的阶乘。然后,函数在递归结束后打印输入数字的阶乘值。

<html>
<head>
   <title> 使用递归计算阶乘 </title>
</head>
<body>
   <h2> 使用 JavaScript 递归计算阶乘 </h2>
   <script>
      // 程序用于计算某个数字的阶乘
      function fact(b) {
         // 如果数字为 0
         if (b === 0) {
            return 1;
         }
         // 如果数字为正数
           else {
            return b * fact(b - 1);
         }
      }
      const n = 6;
      // 如果数字非负,则调用 factorial()
      if (n > 0) {
         let res = fact(n);
         document.write(`The factorial of ${n} is ${res}`);
      }
   </script>
</body>
</html>

在上面的输出中,用户可以看到,递归后我们发现数字的阶乘为 720。

循环递归

我们将在此技术中观察某个函数 1(a) 如何调用函数 2(b)、函数 2(b) 如何调用函数 3(c),而函数 3(c) 如何调用函数 1(a),从而形成一个循环。

示例

在下面的示例中,我们创建了三个函数来理解此方法。首先,我们创建一个带有名为 n 的变量的函数 funA()。我们检查此值是否小于 0 并执行某个操作 (n-1)。此函数调用 funB(),后者在检查 n 是否大于 2 后执行某个操作 (n-2)。然后 funB() 调用另一个接受参数 (n) 的函数 funC()。这就是嵌套递归的工作方式。

<html>
<body>
   <h2> 使用 JavaScript 实现嵌套递归 </h2>
   <script>
      // JavaScript 程序展示循环递归
      function funA(n) {
         if (n > 0) {
            document.write(n.toFixed(0) + "</br>");
            // Fun(A) 正在调用 fun(B)
            funB(n - 1);
         }
      }
      function funB(n) {
         if (n > 1) {
            document.write(n.toFixed(0) + "</br>");
            // Fun(B) 正在调用 fun(C)
            funC(n - 2);
         }
      }
      function funC(n) {
         if (n > 1) {
            document.write(n.toFixed(0) + "</br>");
            // Fun(C) 正在调用 fun(A)
            funA(n);
         }
      }
      funA(5);
   </script>
</body>
</html>

用户可以观察到,传递给 funA() 的第一个值是 5。然后执行 (n-1) 我们得到 4。然后 (n-2) 我们得到 2。类似地,(n) 我们得到 2。然后我们得到 (n-1) 是传递给 funB() 的 1。

嵌套递归

参数将通过递归函数在此递归中作为递归调用发送。"递归中的递归"就是它的含义。为了理解这个递归,让我们看一个例子。

语法

func(n)
{
   Return func(func(n-1))
}

参数

  • n − 用于在嵌套递归中执行任何计算的参数。

示例

在此示例中,我们创建了一个名为 fun() 的函数,该函数从驱动程序获取 num 的值。这里我们创建了一个带有一个整数参数的函数 nested。在此函数内部有一个 if-else 块,它检查是否 num> 100,然后返回 num- 10,否则返回 nested (nested (num + 11))。

<html>
<body>
   <h3> JavaScript 程序展示嵌套递归 </h3>
   <script>
      function fun(num){ 
         // 传递参数的递归函数
         // 作为递归调用或递归
         // 在递归内部
         if (num > 100)
            return (num - 10);
          else
            return fun(fun(num + 11));
      }
      var r;
      r = fun(98);
      document.write(r);
   </script>
</body>
</html>

输出显示如何递归调用作为 num 传递的 98,并最终给出值 91。

结论

这三种方法阐明了执行递归的不同方法。第一种方法是一种简单的方法,可帮助用户找出数字的阶乘。第二种方法有助于了解如何使用三个函数通过循环递归技术执行递归。第三种方法展示了 JavaScript 中嵌套递归的实现方式。


相关文章