JavaScript 中的递归

unity | 动画模块之滚动选项框 动画模块之滚动选项框 阅读详情

什么是递归?

递归是一个调用自身的过程。递归函数是为了执行函数而调用自身的函数。递归函数的语法是:

从上图中我们可以看到,该recurse()函数在其内部被调用。

递归函数的工作原理

递归函数无限运行,因此需要一个条件才能突破。这个条件通常是一个 if 语句。如果条件不满足,则递归函数运行,但立即满足该条件,递归函数返回一个值并停止运行。

递归和迭代之间的区别

许多开发人员将递归与迭代混为一谈。虽然它们执行类似的操作(即它们用于重复过程),但它们的语法有些不同。

递归使用函数调用使语句在函数体中重复运行,而迭代使用for、while和do while循环来重复执行语句。

大多数可以使用迭代方法解决的问题也可以使用递归来解决。

示例 1:
在这个例子中,我们想从给定的数字倒数到零。

使用迭代:

function countDown(n){
  for (let i = n; i > 0; i--){
    console.log(i);
  }
  console.log("Hurray");
}

// running our function
countDown(5);

输出:

5
4
3
2
1
Hurray

使用递归:

function countDownRecursive(n){
  // first we create our breakout condition 
  if (n < 1){
    return console.log("Hurray");
  }
  console.log(n);
  countDownRecursive(n-1);
}

// running our function
countDownRecursive(5);

输出:

5
4
3
2
1
Hurray

解释:
迭代函数 在使用的​​迭代方法中,我们可以看到,一旦输入数字被传递,并且函数被运行,变量 i 被注销然后减少,直到它变为 1 并打印“Hurray”。

递归函数 在递归方法中,会发生这种情况

countDown(5) prints 5 and calls countDown(4)
countDown(4) prints 4 and calls countDown(3)
countDown(3) prints 5 and calls countDown(2)
countDown(2) prints 5 and calls countDown(1)
countDown(1) prints 1 and calls countDown(0) which is less than 0, and hence returns "Hurray".

示例 2:
在此示例中,我们要在某个范围内添加数字,从该数字到一。

使用迭代:

function sumRange(n){
  let total = 0;
  for(let i = n; i > 0; i--){
    total += i;
  }
  return total;
}

console.log(sumRange(5));

输出:

15

使用递归:

function sumRangeRecursive(n, total = 0){
  if(n <= 0){
    return total;
  }
  return sumRangeRecursive(n-1, total + n);
}

console.log(sumRangeRecursive(5));

输出:

15

解释:
迭代函数 运行函数时,首先初始化总变量,并在从给定输入到 1 的范围内添加 i 并减少 i 直到 i 小于零并返回总结果

递归函数 需要两个参数,范围的起点和设置为零的总参数。这是运行函数时发生的情况,

sumRangeRecursive(5, total = 0) calls sumRangeRecursive(4, total = 0 + 5)
sumRangeRecursive(4, total = 5) calls sumRangeRecursive(3, total = 4 + 5)
sumRangeRecursive(3, total = 9) calls sumRangeRecursive(2, total = 9 + 3)
sumRangeRecursive(2, total = 12) calls sumRangeRecursive(3, total = 12 + 2)
sumRangeRecursive(1, total = 14) calls sumRangeRecursive(3, total = 14 + 1)
returns 15

谢谢大家阅读❤。

从零到英雄:如何用FPGA和AD9288打造你的第一台便携式示波器 本文详细介绍了如何利用FPGA和AD9288 ADC芯片从零开始打造一台高性能便携式示波器。通过硬件架构设计、高速数据采集系统实现及信号处理与显示系统的开发,读者可以掌握400Msps采样率的实现方法,并了解关键器件选型与系统优化技巧。 阅读详情

相关推荐

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示

本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。

night的博客 851

JavaScript 递归的几种写法

树型结构生成sql,用于插入mysql。(也就是叫你调用函数名)有的时候,我们拿到一个树,但是没有。递归调用接口,结果组装成 map。我们如下处理给它补上。

灵台方寸山斜月三星洞 6289

Zlib1.2.11源码编译(Win10+VS2019)

下载 下载网址: zlib Home Site 得到文件: 解压缩到“D:\SourceCodes\zlib-1.2.11” 使用CMake配置、生成并打开项目 将CMakeLists.txt拖入CMake,配置(Configure): 生成(Generate) 打开项目(Open Project),CMake调用VS2019打开项目 生成debug版本 构建项目ALL_BUILD。成功生成debug版本 在“D:\Sourc...

Alexabc3000的专栏 1893

js递归遍历讲解

JavaScript的递归遍历会经常遇到,适当的运用递归遍历,可以提高代码性质量。 1.某些时候递归能替换for循环 我们先看一下下面2个例子。 var arrList = [1,2,3,5,100,500,10000,10000,1000,10000002] //for循环测试 function forTest(){ console.time("for循环") for(l...

天心天地生的博客 1148

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3596

实战分享:如何用Jetson Nano+HM30图传搭建低空YOLOv5检测系统(附VNC避坑指南)

本文详细介绍了如何利用Jetson Nano和HM30图传搭建低空YOLOv5检测系统,重点解决了无人机应用中的硬件连接和VNC延迟优化问题。通过对比WiFi直连与图传方案的优劣,提供了网络配置、VNC优化及YOLOv5模型加速的实战技巧,帮助开发者实现高效稳定的低空目标检测系统。

weixin_29174385的博客 110

JavaScript 递归算法

第一次认识递归这个概念在两年前, 一个递归函数(不是深拷贝)看了好久才看懂, 在函数内部再次调用自己, 返回一个新的值, 再此期间还涉及多次对自己的调用, 这对于当时的我还是太过超前了.不过直到最近, 我对’递归’的认知也几乎只是这些, 我还是希望能有更深刻的理解.迭代比递归执行起来要快很多, 递归相较于迭代需要的代码更少且更易理解, 另外, 有了尾调用优化, 递归的多余消耗甚至可能被消除.

白瑕 的博客 2336

TongWeb微服务部署实战:Nacos注册与网关路由的疑难解析

本文分享了将Spring Cloud微服务迁移至TongWeb应用服务器时,解决Nacos服务注册失败与Spring Cloud Gateway路由失效的实战经验。针对Nacos注册问题,通过实现ApplicationRunner接口并利用JMX获取容器端口,实现了手动注册;针对网关路由问题,建议将基于WebFlux的Gateway模块改为JAR包独立部署,以保障其原生运行环境。文章为在TongWeb上进行微服务部署提供了关键的问题排查思路与混合架构部署的最佳实践。

weixin_29209801的博客 240

JS中的递归

递归函数 在js中函数自己调用自己,就称为递归。 递归函数的必要条件 递归方程以及递归结束条件,即给递归函数安排出口

qq_29691213的博客 1万+

《深入浅出多模态》(二):多模态任务及数据集介绍

本文为《深入浅出多模态》系列第二章,《多模态任务介绍与背景》主要介绍多模态模型的概念、技术难点、下游任务(Visual Grounding、VQA、image/Video Captioning等)及各类应用方向数据集展开介绍,本专栏适合从事多模态小白及爱好者学习,欢迎大家关注,如有侵权请联系删除!

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 3834

手把手教你学simulink(41.4)--逆变器电场景示例:基于Simulink的主从控制的多逆变器协同控制(Multi-Inverter Coordinated Control)

需求分析在现代电力系统中,分布式发电和储能系统的广泛应用使得多个逆变器并联运行成为常见的应用场景。为了确保多个逆变器之间的协同工作,实现系统的稳定性和高效性,通常采用主从控制(Master-Slave Control)策略。主从控制通过一个主控制器(Master)来协调多个从控制器(Slave),确保所有逆变器的输出电压、频率和功率分配符合预期目标。本项目将基于Simulink平台,开发一个多逆变器协同控制系统,采用主从控制策略,实现对多个逆变器的精确控制和优化。

MHD0815的博客 306

JavaScript之递归 详解!

作为一位名副其实的前端菜鸡,不懂递归肯定是不符合气质的。今天就深究一下递归的定义以及如何运作的,他的内部到底干了什么不可告人的事情? 首先了解一下递归的定义: 递归:递归函数自己调用自己,且函数内部必须有结束条件、否则就是一个死循环; 递归案例:求 n的阶乘 (循环 || 递归) 阶乘公式先了解一下: 即n的阶乘 = n*(n-1)的阶乘,如归使用for循环来做这件事件就很...

米斯特曹 3860

Exploring Automated Distractor Generation for Math Multiple-choice Questions via Large Language Mode

多项选择题(MCQ)在几乎所有级别的教育中都无处不在,因为它们易于管理、评分,并且是评估和实践中可靠的格式。MCQ最重要的方面之一是干扰因素,即旨在针对真实学生常见错误或误解的不正确选项。迄今为止,对于教师和学习内容设计师来说,制作高质量的干扰物的任务在很大程度上仍然是一个劳动和时间密集型的过程,其可扩展性有限。在这项工作中,我们研究了数学MCQ领域的自动干扰物生成任务,并探索了从上下文学习到微调的各种基于大型语言模型(LLM)的方法。

c_cpp_csharp的专栏 317

js递归遍历树形json_JavaScript中递归运用技巧详细讲解

点击右上方红色按钮关注“web秀”,让你真正秀起来递归基础知识什么是递归在JavaScript程序中,函数直接或间接调用自己。通过某个条件判断跳出结构,有了跳出才有结果。JavaScript中如何使用递归?递归的步骤(技巧)1、假设递归函数已经写好 2、寻找递推关系 3、将递推关系的结构转换为递归体 4、将临界条件加入到递归体中(一定要加临界条件,某则陷入死循环,内存泄漏)简单递归示例通过简单的示...

weixin_39625987的博客 2207

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JS递归的用法JavaScript递归)

递归: 函数中用调用函数自己,此时就是递归,递归一定要有结束条件 function f1() { console.log("从前有座山,山里有个庙,庙里有个老和尚给小和尚讲故事:"); }; f1();//浏览器崩溃,因为没有结束条件——死循环 改进如下: var i=0; function f1() { ...

Chad97的博客 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

js 中的递归应用+异步递归

js 中的递归应用+异步递归

m0_51244077的博客 1932

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

递归javascript_JavaScript中的递归

递归javascriptby Kevin Ennis 凯文·恩尼斯(Kevin Ennis) JavaScript中的递归 (Recursion in JavaScript) I’m just gonna get this out of the way right up front, because people get really angry otherwise: 我只是直接解决这个问题,...

cumi7754的博客 217

[JS] Javascript递归问题 | Javascript遍历方式

JS递归常见问题 JS函数传值 对象传值都是引用传值,原变量与函数参数变量之间有引用关系,即值改变,原变量的值也会改变 遍历数组、对象等一定要用以下方式迭代 用以下方式有意想不到的错误,array不会被完全遍历到

geodoer 3483

JavaScript中的递归

原文链接 1. 递归是啥? 递归概念很简单,“自己调用自己”(下面以函数为例)。 在分析递归之前,需要了解下 JavaScript 中“压栈”(call stack) 概念。 2. 压栈与出栈 栈是什么?可以理解是在内存中某一块区域,这个区域比喻成一个箱子,你往箱子里放些东西,这动作就是压栈。所以最先放下去的东西在箱子最底下,最后放下去的在箱子最上面。把东西从箱子中拿出来可以理解为出栈。 所以得...

匪君的博客 236

解锁JavaScript函数式编程潜能:JS_Fun_Practice的递归函数详解

JavaScript函数式编程是现代前端开发的核心技能之一,而递归作为函数式编程的精髓,能够帮助开发者编写更简洁、更具可读性的代码。JS_Fun_Practice项目提供了一系列有趣的函数式编程练习,特别适合新手通过实践掌握递归函数的核心原理与应用技巧。 ## 为什么选择递归?探索函数式编程的魅力 ✨ 在传统的命令式编程中,我们常常依赖`for`或`while`循环来处理重复任务。而在函数式编

gitblog_00038的博客 1012

js中的递归算法

js递归定义: 递归函数就是在函数体内调用本函数 递归函数的使用要注意函数终止条件,避免进入死循环 简单的递归实例 1.求1,2,3,…n的和 function sum(n){ if( n == 1 ) return 1; return sum(n-1) + n; } 2.求1,3,5,7,…第n项和前n项的和 先求出第n项的值 function foo(n){ if(n == 0) return 1; return foo(n-1) + 2; } 接着求前n项的和

AK的博客 3275

JS 递归 和JAVA递归不同

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnNJS 递归与 JAVA 递归的区别 递归是编程中一种重要的技巧,它允许函数直接或间接地调用自身。递归在实现某些算法时非常方便,尤其是在解决问题时具有自相似特征的问题 (如树或图的遍历)。然...

weixin_30043179的博客 126

细说JavaScript中的尾递归

在尾递归优化中,当前函数调用的返回值直接被传递给下一次递归调用,而不涉及额外的操作。尾递归是一种特殊形式的递归,指的是递归函数在执行的过程中,递归调用是整个函数体中最后执行的语句。如果递归调用的层次过深,并且没有正确的终止条件,调用栈会不断增长,最终导致栈溢出。所以,尾递归是否能够成功优化取决于具体的 JavaScript 引擎,不同的引擎在对尾递归的处理上可能有差异。当函数递归调用自身或其他函数过于频繁,而递归调用的层次没有得到正确的终止条件,就可能导致栈溢出。以下是不同的环境下测试的结果。

liuv587的博客 1288

js递归

js递归调用// 一个简单的阶乘函数 var f = function (x) { if (x === 1) { return 1; } else { return x * f(x - 1); } }; Javascript中函数的巨大灵活性,导致在递归时使用函数名遇到困难,对于上面的变量式声明,f是一个变量,所...

前端技术的学习整理 4万+

js递归算法

js递归算法 递归作为算法的基础之一,如果需要学习算法,递归是避不开的,今天就带大家理解递归的原理以及作用。 使用递归可以压缩代码量以及增加代码的可读性 提示:以下是本篇文章正文内容,下面案例可供参考 一、递归是什么? 递归的核心在于‘递’和‘归’。 简单来讲就是在函数内部调用本函数,并将处理过的参数传递给自己处理,再通过自己返回的参数来执行,完成函数的需求。 ps:使用递归可以压缩代码量以及增加代码的可读性 二、步骤 1.递归的目的 说到递归,最经典的就是斐波那契数列(Fibonacci seq

lonelyiiblack的博客 1292

一个靠谱的json递归,js递归,javascript递归

var arrs=[];   function getinfo(items) { for (var item of items){ if (item.children){ arrs.push({ id: item.id, parentid:...

petterkelus的博客 2107
上一篇: 如何在 Android 模拟器中禁用自动关闭?
下一篇: 通过 Github 工作流的 Android 的 CI/CD 管道
网络安全-XG
博客等级 码龄5年 1万+粉丝 2752原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值