诚之和:递归到底是什么? JavaScript代码展示

递归是一种通过迭代解决问题的方法。换句话说,递归函数是一个无限重复调用自身的函数(或直到某事停止它)。

关于递归函数的重要知识

每当你选择使用递归函数时,请记住这两个基本信息。

信息 1:递归不是 IIFE

递归函数不同于立即调用函数表达式(IIFE)。

IIFE 会自动调用一次自身。

但是,递归函数会在无限时间内自动重复调用自己,或者直到某些东西停止重新调用为止。

信息 2:递归函数需要一个基本情况

为停止递归函数的重新调用而编写的代码称为基本情况。

在创建递归函数时定义基本情况总是很重要的——这样函数就不会无休止地运行,从而使浏览器崩溃。

递归函数的例子

下面是一个JavaScript代码,它返回通过函数的递归调用返回的所有值的串联countDown()

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#201e2f"><span style="color:#f8f8f2"><code><span style="color:#75715e">// Create a recursive function:</span>
<span style="color:#f92672">function</span> <span style="color:#a6e22e">countDown</span>(<span style="color:#f8f8f2">num</span>) {
   <span style="color:#75715e">// Define the base case of this recursive function:</span>
   <span style="color:#f92672">if</span> (num < <span style="color:#ae81ff">0</span>) {
      <span style="color:#f92672">return</span> <span style="color:#e6db74">"</span><span style="color:#e6db74">Recursion Stopped!</span><span style="color:#e6db74">"</span>;
   }

   <span style="color:#75715e">// Define the recursive case:</span>
   <span style="color:#f92672">return</span> num + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(num - <span style="color:#ae81ff">1</span>);
}

<span style="color:#75715e">// Invoke the countDown() recursive function:</span>
countDown(<span style="color:#ae81ff">2</span>);

<span style="color:#75715e">// The invocation above will return:</span>
<span style="color:#e6db74">"</span><span style="color:#e6db74">2, 1, 0, Recursion Stopped!</span><span style="color:#e6db74">"</span></code></span></span></span></span>

笔记

在上面的递归算法中,countDown(num - 1)代码使整个函数成为递归,因为是代码使countDown()recall本身重复。

看看幕后的事件

当我们调用countDown函数并传入值2(即countDown(2))时,算法开始运行如下:

第 1 步:检查是否2小于0

计算机检查了2我们传递给函数num参数的countDown值是否小于0

由于2不小于0,计算机没有执行if语句的代码。相反,它跳到if语句之后的下一个代码——递归代码。

第二步:执行return语句

跳过if语句后,计算机执行return num + " " + countDown(num - 1)代码——但num用参数的值(即2)替换参数,如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#201e2f"><span style="color:#f8f8f2"><code><span style="color:#f92672">return</span> num + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(num - <span style="color:#ae81ff">1</span>);
<span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(<span style="color:#ae81ff">2</span> - <span style="color:#ae81ff">1</span>);
<span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(<span style="color:#ae81ff">1</span>);</code></span></span></span></span>

第 3 步:仅执行递归语句

在上面第 2 步的代码中,请注意该return命令无法返回任何值,因为该return语句包含countDown(1)调用该countDown函数的递归代码 ( ) 。

因此,在保留return语句的其他部分(即2 + ", " +)的同时,计算机将只执行递归代码(countDown(1))。

换句话说,countDown(1)代码将countDown在传入 value 时自动调用该函数1。然后,算法将通过检查是否1小于重新开始运行0

由于1不小于0,计算机跳到递归代码,如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#201e2f"><span style="color:#f8f8f2"><code><span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + num + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(num - <span style="color:#ae81ff">1</span>);
<span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">1</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(<span style="color:#ae81ff">1</span> - <span style="color:#ae81ff">1</span>);
<span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">1</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(<span style="color:#ae81ff">0</span>);</code></span></span></span></span>

第 4 步:仅调用递归代码

再次注意,该return命令(在第 3 步中)不能返回任何值,因为该return语句包含countDown(0)调用该countDown函数的递归代码 ( ) 。

因此,在保留return语句的其他部分(即2 + ", " + 1 + ", " +)的同时,计算机将只执行递归代码(countDown(0))。因此,countDown(0)代码将countDown在传入 value 时自动调用该函数0

然后,该函数将通过检查是否0小于重新开始运行0

由于0不小于0,计算机跳到递归代码,如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#201e2f"><span style="color:#f8f8f2"><code><span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">1</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + num + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(num - <span style="color:#ae81ff">1</span>);
<span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">1</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">0</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(<span style="color:#ae81ff">0</span> - <span style="color:#ae81ff">1</span>);
<span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">1</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">0</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + countDown(<span style="color:#ae81ff">-</span><span style="color:#ae81ff">1</span>);</code></span></span></span></span>

第五步:只执行递归代码

再说一次,该return命令(在第 4 步中)不能返回任何值,因为该return语句包含一个递归代码 ( countDown(-1)) 来调用该countDown函数。

因此,在保留return语句的其他部分(即2 + ", " + 1 + ", " + 0 + ", " +)的同时,计算机将只执行递归代码(countDown(-1))。因此,countDown(-1)代码将countDown在传入 value 时自动调用该函数-1

然后,该函数将通过检查是否-1小于重新开始运行0

此时,-1小于0。因此,计算机将if通过返回值来执行语句的代码,“Recursion Stopped!”如下所示:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#201e2f"><span style="color:#f8f8f2"><code><span style="color:#f92672">return</span> <span style="color:#ae81ff">2</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">1</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#ae81ff">0</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">, </span><span style="color:#e6db74">"</span> + <span style="color:#e6db74">"</span><span style="color:#e6db74">Recursion Stopped!</span><span style="color:#e6db74">"</span>;</code></span></span></span></span>

最后,该return语句现在具有可以有效连接和返回的值。因此,从的返回值countDown将是:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#201e2f"><span style="color:#f8f8f2"><code><span style="color:#e6db74">"</span><span style="color:#e6db74">2, 1, 0, Recursion Stopped!</span><span style="color:#e6db74">"</span></code></span></span></span></span>

总结

在本文中,我们了解到递归函数是一种重复调用自身直到某事停止调用的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45378258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值