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,一经查实,立即删除!

相关文章

Python数据分析八

一、Python之列表的切片取值 在Python中&#xff0c;我们可以使用切片操作来获取列表中的子集。切片操作使用[start:end:step]的语法&#xff0c;其中start表示起始位置的索引&#xff08;包含&#xff09;&#xff0c;end表示结束位置的索引&#xff08;不包含&#xff09;&a…

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

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

准备Python环境学习OpenCV的使用

安装venv模块&#xff0c;执行如下命令&#xff1a; sudo apt-get install python3-venv创建venv环境&#xff0c;命名为images&#xff0c;执行如下命令&#xff1a; python3 -m venv images进入新建的环境images&#xff0c;执行如下命令&#xff1a; cd images source ./…

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

本书教你两件事——机器学习模型及其使用方法 机器学习模型有不同的类型&#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…

C++中,判断某个自定义结构体是否在该结构体的vector中

demo1源码&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespace std;struct PushStreamIpAndPort {std::string ip"";int port0;// 重载相等运算符 &#xff1a;可不用bool operator(cons…

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模板…

服务器操作系统有几种?

众所周知&#xff0c;电脑上的一切正常运作都不可缺电脑操作系统的使用&#xff0c;网络服务器做为这种出示服务项目的服务器&#xff0c;或许都是不可 或缺的电脑操作系统。常用的网络服务器电脑操作系统有许多&#xff0c;比如&#xff1a;Windows、Linux、Unix等等&#xff…

Spring Boot简介及案例

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

Linux服务器进程自动停止/终结

记录一个现场问题&#xff1a;Linux服务器中的服务进程莫名被杀死&#xff0c;或者启动失败 情况说明&#xff1a;现场是一台Linux的suse系统服务器&#xff0c;前一天客户反应服务有异常&#xff0c;登录查看发现所有的服务进程都没有启动&#xff0c;以为是客户重启服务器了&…

K8S Pod 水平自动扩缩容 HPA

介绍 HPA&#xff08;Horizontal Pod Autoscaler&#xff09;水平扩缩意味着可根据观察到的CPU、内存使用率或自定义度量标准来自动扩展或缩容Pod的数量&#xff08;Deployment、StatefulSet 或其他类似资源&#xff09;。与“垂直”扩缩不同&#xff0c;对于 K8S&#xff0c;…

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生态资产的多元化收益探索正在…