javaScript之递归

什么是递归?

递归函数是在一个函数内通过名字调用自身的情况下构成的。

递归的优点

递归可以用来处理循环解决起来比较麻烦的问题

方法:

1,函数自己调用自己

2,找规律,找出这一次和上一次的关系

2,需要一个出口条件,不能无限递归下去

1,计算阶乘

        什么是阶乘?阶乘是表示从1到该数之间所有正整数的乘积。例如5的阶乘就是5*4*3*2*1,其它的数以此类推。

    function factorial(num){//出口条件是num小于等于1if(num<=1){return 1}else {return num*factorial(num-1)}}console.log(factorial(5))//输出结果为120//对执行过程进行分析/*factorial(5)return factorial(4)*5   24*5=120return factorial(3)*4   6*4=24return factorial(2)*3   2*3=6return factorial(1)*2   1*2=2return 1* */

2,斐波那契数列

斐波那契数列是一个经典的数学序列,其特点是每个数字都是前两个数字之和。通常用F(n)表示第n个斐波那契数。数列的前几项通常为0, 1, 1, 2, 3, 5, 8, 13, 21, …等等,既后一个数是前两个数之和。

    function fib(n) {//出口条件为n小于3if(n<3){return 1}else{return fib(n-1)+fib(n-2)}}console.log(fib(7))//过程分析/*return fib(6)+fib(5)  7+5=13return fib(5)+fib(3)    4+3=7return fib(3)+fib(1)  3+1=4* */

3,使用递归求和

    function sum3(num){if(num==1){return 1}else {return num+sum3(num-1)}}console.log(sum3(10))//输出 55

在控制台调试可以看到,每一次调用自身就会先入栈,最终根据先进后出的原则返回,最终返回结果。

4,使用递归对数组进行拍平

<script>//对数据进行拍平function flattenArray(arr) {let result = [];for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {//递归调用来处理嵌套函数result = result.concat(flattenArray(arr[i]));} else {result.push(arr[i]);}}return result;}// 测试let newArray = [1, [2, [3, 4,[5,6,[7,8]]], 9], 10];console.log(flattenArray(newArray));  // 输出: [1, 2, 3, 4, 5, 6,7,8,9,10]
</script>

遍历传入的数组。如果数组中的某个元素是另一个数组,就递归调用flattenArray函数来拍平那个子数组,并将结果连接到result数组中。如果元素不是数组,就直接将其添加到result数组中。最后返回result数组,它包含了原数组的所有元素,返回的结果是已经拍平的一维数组。

5,使用递归拼接树形结构

<script>const list = [{ id: 1, name: 'Node 1', parentId: null },{ id: 2, name: 'Node 1.1', parentId: 1 },{ id: 3, name: 'Node 1.2', parentId: 1 },{ id: 4, name: 'Node 2', parentId: null },{ id: 5, name: 'Node 2.1', parentId: 4 },{ id: 6, name: 'Node 2.2', parentId: 4 }];function buildTree(list, parentId = null) {let tree = [];for (let item of list) {if (item.parentId === parentId) {const children = buildTree(list, item.id);if (children.length) {item.children = children;}tree.push(item);}}return tree;}// 生成树形结构const tree = buildTree(list);console.log(tree);
</script>

首先遍历所有节点,并检查每个节点的parentId是否等于当前的parentId参数。如果相等,我们就递归调用buildTree函数。并将返回的子节点数组赋值给当前节点的children属性。然后将当前节点添加到tree数组中。最后,返回tree数组。

6,递归的缺点

  1. 调用栈限制:递归函数在每次调用时都会在在栈上创建一个新的栈帧。如果递归深度过大,可能会超出调用栈的最大限制,导致“栈溢出”错误(StackOverflowError)。

  2. 性能问题:递归通常比迭代更消耗资源,因为每次递归调用都会涉及函数调用的开销,包括参数传递、栈帧的创建和销毁等。在性能敏感的应用中,递归可能不是最佳选择。

  3. 代码可读性:递归函数通常比迭代函数更难理解和调试。递归逻辑可能不如迭代直观,特别是当递归涉及多个分支或复杂条件时。这可能导致代码维护困难,增加出错的可能性。

  4. 不易于调试:递归函数在调试时可能会比较困难,因为函数调用栈可能非常深,使得跟踪和理解问题的根源变得复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这是斗魂大赛?不!是斗美大赛!

最近《绝世唐门》中斗魂大赛正如火如荼地展开&#xff0c;每场对战都十分精彩&#xff0c;令人心潮澎湃&#xff0c;忍不住大喊“过瘾”&#xff01; 除了扣人心弦的打斗场面&#xff0c;新登场的角色们更是颜值爆表&#xff0c;美得令人心动&#xff0c;帅得让人窒息。不得不赞…

机器学习模型及其使用方法——《机器学习图解》

本书教你两件事——机器学习模型及其使用方法 机器学习模型有不同的类型&#xff0c;有些返回确定性的答案&#xff0c;例如是或否&#xff0c;而另一些返回概率性的答案。有些以问题的形式呈现&#xff1b;其他则使用假设性表达。这些类型的一个共同点是它们都返回一个答案或…

配置中心apollo==springboot使用apollo

多环境的APOLLO之前已经搭建好了。 新建一个SPRINGBOOT项目 <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>2.2.0</version> </dependency> <?x…

L2-4 部落

在一个社区里&#xff0c;每个人都有自己的小圈子&#xff0c;还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里&#xff0c;于是要请你统计一下&#xff0c;在一个给定社区中&#xff0c;到底有多少个互不相交的部落&#xff1f;并且检查任意两个人是否属…

实现定时任务

定时任务的实现方式有很多&#xff0c;比如XXL-Job等。但是其实核心功能和概念都是类似的&#xff0c;很多情况下只是调用的API不同而已。 这里就先用SpringBoot为我们提供的定时任务的API来实现一个简单的定时任务&#xff0c;让大家先对定时任务里面的一些核心概念有个大致的…

网络编程(1)写一个简单的UDP网络通信程序【回显服务器】,并且实现一个简单的翻译功能

使用 JAVA 自带的api 目录 一、回显服务器 UdpEchoServer 服务器代码 客户端代码 二、翻译功能 UdpDictServer 在UdpDictServer里重写process方法 一、回显服务器 UdpEchoServer /*** 回显服务器* 写一个简单的UDP的客户端/服务器 通信的程序* 这个程序没有啥业务逻辑&am…

TSINGSEE青犀智慧工厂视频汇聚与安全风险智能识别和预警方案

在智慧工厂的建设中&#xff0c;智能视频监控方案扮演着至关重要的角色。它不仅能够实现全方位、无死角的监控&#xff0c;还能够通过人工智能技术&#xff0c;实现智能识别、预警和分析&#xff0c;为工厂的安全生产和高效运营提供有力保障。 TSINGSEE青犀智慧工厂智能视频监…

PaddleGAN快速让你的照片动起来

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2024.03.30 Last edited: 2024.03.30 目录 PaddleGAN快速让你的照片动起来 两个方案让照片动起来 方案一&#xff1a;FirstOrder 下载Paddle…

CAPL实现关闭TCP连接的几种方式以及它们的区别

在讲正文前,我们有必要复习下关闭TCP连接的过程:四次挥手。 假设A和B建立TCP连接并进行数据传输,当A的数据发送完后,需要主动发起断开连接的请求: A发送FIN报文,发起断开连接的请求B收到FIN报文后,首先回复ACK确认报文B把自己的数据发送完,发送FIN报文,发起断开连接的…

uniapp中安装vant2

1.uniapp项目搭建 因为是安装vant2所以项目选择vue2&#xff0c;如果vue3项目的话安装vant3 2.安装vant npm i vantlatest-v2 3.在main.js文件引入挂载vant 说明&#xff1a;// #ifndef VUE3这里是vue2模板用来挂载注册组件的地方&#xff1b;// #ifdef VUE3这里是vue3模板…

Spring Boot简介及案例

文章目录 Spring Boot简介以下是一个简单的 Spring Boot Web 应用实例**步骤 1&#xff1a;创建 Spring Boot 项目****步骤 2&#xff1a;编写 RESTful 控制器****步骤 3&#xff1a;配置主类****步骤 4&#xff1a;运行并测试应用** Spring Boot简介 Spring Boot 是一个用于简…

canvas跟随鼠标画有透明度的矩形边框

提示&#xff1a;canvas跟随鼠标画有透明度的矩形边框 文章目录 前言一、跟随鼠标画有透明度的矩形边框总结 前言 一、跟随鼠标画有透明度的矩形边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

【动手学深度学习-pytorch】9.2长短期记忆网络(LSTM)

长期以来&#xff0c;隐变量模型存在着长期信息保存和短期输入缺失的问题。 解决这一问题的最早方法之一是长短期存储器&#xff08;long short-term memory&#xff0c;LSTM&#xff09; (Hochreiter and Schmidhuber, 1997)。 它有许多与门控循环单元&#xff08; 9.1节&…

HTX Ventures:为什么BounceBit可能成为新的BTC生态解决方案?

随着BTC现货ETF的通过&#xff0c;全球各大机构和个人都在不断加码对BTC的持仓&#xff0c;BTC价格也随之上升&#xff0c;目前已上升至全球市值排名前十的资产。在本轮市场周期中&#xff0c;BTC铭文和BTC扩容是两个被市场高度关注的细分赛道。BTC生态资产的多元化收益探索正在…

Django详细教程(一)

文章目录 一、安装Django二、创建项目1.终端创建项目2.Pycharm创建项目&#xff08;专业版才可以&#xff09;3.默认文件介绍 三、创建app1.app介绍2.默认文件介绍 四、快速上手1.写一个网页步骤1&#xff1a;注册app 【settings.py】步骤2&#xff1a;编写URL和视图函数对应关…

基于微信小程序的校园服务平台设计与实现(程序+论文)

本文以校园服务平台为研究对象&#xff0c;首先分析了当前校园服务平台的研究现状&#xff0c;阐述了本系统设计的意义和背景&#xff0c;运用微信小程序开发工具和云开发技术&#xff0c;研究和设计了一个校园服务平台&#xff0c;以满足学生在校园生活中的多样化需求。通过引…

最优算法100例之13-输出第n个丑数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当…

目标检测评价标准

主要借鉴&#xff1a;https://github.com/rafaelpadilla/Object-Detection-Metrics?tabreadme-ov-file 主要评价指标、术语&#xff1a; Intersection Over Union (IOU)&#xff1a;两个检测框交集面积与并集面积的比值 True Positive (TP)&#xff1a;IOU大于阈值的检测框…

Elasticsearch入门及常用命令和Spring中的常用操作

入门 官网 简介 一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索。搜索速度快&#xff0c;可以提供实时的搜索服务。便于水平扩展&#xff0c;每秒可以处理PB级海量数据。 常用术语 索引&#xff1a;与MySQL数据库中的Database相对应类型&#xff1a;与…

Unity中如何实现草的LOD

1&#xff09;Unity中如何实现草的LOD 2&#xff09;用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理 3&#xff09;关于进游戏程序集加载的问题 4&#xff09;预制件编辑模式一直在触发自动保存 这是第379篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热…