专业游戏门户,分享手游网游单机游戏百科知识攻略!

嗨游网
嗨游网

js递归函数详解,js编写递归函数

来源:小嗨整编  作者:小嗨  发布时间:2023-02-23 05:04
摘要:js递归函数详解,js编写递归函数,在这篇文章中,你都能收获到如何用JavaScript编写递归函数!本文旨在通过分解和单步执行递归JavaScript函数来学习和理解它的工作原理。根据您的JavaScript水平,您可以随意跳过本文。如果...

首先,关于该Array.prototype.reduce()方法的一些注意事项。这不是该解决方案的主要功能,但对于初学者来说可能很少,所以我宁愿简单地介绍一下。

简而言之,reduce 方法将原始数组合并为一个值——它实际上可以是任何东西,从一个string或number到一个全新的数组或一个对象。为此,它遍历其子项并使用自定义函数(reducer 回调函数)处理每个子项。reducer 将始终接收有关当前迭代的数据作为参数,最重要的是:

  1. 将扩展的合并(或“累积”)值,然后传递到下一次迭代;

  2. 在此迭代中正在处理的当前子项。

因此,reduce 方法本身需要:

  1. reducer 回调函数,如上所述;

  2. 合并值的初始状态。

有关实际操作的解释,您可以参考Mosh 的这个非常好的视频。

现在是递归的实际使用。

简单的说,递归就是一个调用自身的函数。这可以概括它,但它的适用性对于初学者来说可能有点难以捉摸。

让我们从解决问题开始:递归 !== 循环。它不是,如果您将它用于此目的,那么您只是在构建令人困惑的代码。

当我们需要迭代一个相互连接的元素(称为节点)的结构时,递归真的很闪耀,你需要处理、排序或在其中查找某些东西,而以前不知道它的大小或深度。诸如树遍历、路径查找和排序算法之类的东西是需要递归的常见场景。

那么为什么它适用于我们当前的场景呢?假设您要使用for循环展平数组:

function flatten(arr) {
  const newArray = [];
  for (const item of array) {
    if (Array.isArray(item)) newArray.push(...item);
    else newArray.push(item);
  }
  return newArray;
}
const array = [1, 2, [3, 4]];
// [1, 2, 3, 4];
console.log(flatten(array));

当然,这行得通,但请尝试不同的、更精细的数组结构。比方说:

const ohnoes = [1, 2, [3, [4, 5]]];
// [1, 2, 3, [4, 5]]
console.log(flatten(ohnoes));

您可能意识到,n for在代码中嵌套循环以考虑n可能的层是完全不可持续的。

然而,递归思考通常是一项艰巨的任务。让我们仔细看看这个问题:

  • 我们想要展平一个可能有子数组的数组;

  • 但是,不能保证子数组自身会被展平。

您可能猜到我们现在也需要调用相同的函数来对数组的每个子项进行微观管理。考虑到:

  • 该函数应该只return用扁平化的数组到达它的表达式;

  • 递归路径最终会到达结构的底部节点——一个没有子数组的数组——然后返回它。

所有这些堆栈函数调用都被恰当地称为调用堆栈。当我们当前的堆栈最终自行解决时,我们必须期望得到的数组是——哒哒!像 1 周大的苏打水一样平淡。

现在剩下的就是将我们的递归函数放在一起:

function flattenRecursive(arr) {
    // loop through the children to see which requires flattening
    return arr.reduce(
        (consolidated, child) => {
            // check if the child is an array itself
            if (Array.isArray(child)) {
                // we need to flatten the array before including its elements in
                // our consolidated array, so we call flattenRecursive recursively
                consolidated.push(...flattenRecursive(child));
            } else {
                // not an array, so just include it in the final array
                consolidated.push(child);
            }
            // return the consolidated array
            return consolidated;
        },
        [], // the initial, empty array
    );
}

现在我们得到:

const yay = [1, 2, [3, [4, [5, [6, [[[[[7], [8, 9]]]]]]], 10]]];
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(flattenRecursive(yay));

仅此而已!


本文地址:IT问答频道 https://www.eeeoo.cn/itwenda/903307_3.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!

共3页 1 2 3 当前是最后一页

IT问答
小编:小嗨整编
相关文章相关阅读
  • 总结CreateJS的详细介绍

    总结CreateJS的详细介绍

    CreateJS库是一款HTML5游戏开发的引擎,是一套可以构建丰富交互体验的HTML5游戏的开源工具包,旨在降低HTML5项目的开发难度和成本,让开发者以熟悉的方式打造更具现代感的网络交互体验。掌握了CreateJS可以更方便的完成HTM...

  • jsp文件怎么创建

    jsp文件怎么创建

    创建jsp文件的步骤:1、安装和配置java开发环境;2、安装和配置web服务器;3、创建jsp文件;4、编写jsp代码;5、部署和运行应用程序;6、调试和测试。详细介绍:1、安装和配置java开发环境,首先需要在计算机上安装jdk,可以从...

  • JS怎么获取当前时间戳

    JS怎么获取当前时间戳

    js获取当前时间戳,可以通过date.now()方法来实现,返回自1970年1月1日00:00:00utc以来经过的毫秒数也就是当前时间戳。下面我们就结合具体的代码示例,给大家介绍JS怎么获取当前时间戳。代码示例如下:...

  • nodejs 解决413错误

    nodejs 解决413错误

    在使用node.js开发web应用程序时,你可能会遇到处理大文件上传的情况。然而,当上传的文件太大时,可能会遇到http413请求实体过大的错误。这是因为默认情况下,node.js对请求体大小的限制为100kb。当请求实体大小...

  • js手机号码正则表达式

    js手机号码正则表达式

    正则表达式(regularexpression)是一个描述字符模式的对象。使用javascript正则表达式可以进行强大的模式匹配和文本检索与替换功能。手机号码正则表达式验证。functioncheckPhone(){var...

  • JSF和JavaScript有什么区别

    JSF和JavaScript有什么区别

    区别:jsf是一种用于构建web应用程序的java框架,提供了一种以组件为中心来开发javaweb用户界面的方法,从而简化了开发。而javascript是一种解释型的脚本语言,被广泛用于web应用开发,常用来为网页添加各式各样的动态功能。...

  • js中有哪些事件?js中常用事件的介绍

    js中有哪些事件?js中常用事件的介绍

    javascript使我们有能力创建动态页面。事件是可以被javascript侦测到的行为。网页中的每个元素都可以产生某些可以触发javascript函数的事件。那么,js中有哪些事件呢?本篇文章将给大家来介绍关于js中常用的事件。话不多说...

  • 什么是jsp开发技术

    什么是jsp开发技术

    什么是jsp开发技术?JSP全名为JavaServerPages,中文名叫java服务器页面,是一种动态网页技术。JSP是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptl...

  • 周排行
  • 月排行
  • 年排行

精彩推荐