学习笔记(17)递归

news/2024/7/19 13:07:18 标签: javascript, js, 递归

目录

定义

递归:是一种自己调用自己的算法,将大型的复杂问题,层层转化为一个与原问题相似但规模较小的问题来求解。而在JavaScript中,函数直接或间接的调用自己,则该函数便称为递归函数。

递归使用

js">//计算阶乘
function factorial(n) {
  // 基本情况
  if (n === 0 || n === 1) {
    return 1;
  } 
  // 递归调用
  else {
    return n * factorial(n - 1);
  }
}

console.log(factorial(5));  //120

递归函数一般包括两个关键部分:

  1. 基本情况(Base Case): 这是递归终止的条件,也被称为递归出口。在递归过程中,函数检查是否达到基本情况,如果满足基本情况,则直接返回结果,不再进行进一步的递归调用。

例如,在计算阶乘时,基本情况可能是 n === 0 或 n === 1,此时我们知道阶乘的结果是 1。

  1. 递归调用(Recursive Call): 当函数未达到基本情况时,它会基于较小或简化的问题再次调用自身。每一次递归调用都会向函数传递更接近基本情况的参数,直到最终达到基本情况并开始逐层返回结果。

递归分类

递归

如果递归有在函数调用后要执行的代码语句,则它是头递归。头递归通常很难转换为循环语句。

js">function head(n) {
    if (n == 0) {
        return 0
    }
    head(n - 1)
    console.log(n);
}

head(5)  //1 2 3 4 5

递归

递归在函数调用之后不会有任何代码语句,通常在函数声明的末尾。尾递归很容易转换成循环语句。

js">function tail(n) {
    if (n == 0) {
        return 0
    }
    console.log(n);
    tail(n - 1)
}

tail(5)  //5 4 3 2 1

注意事项

递归函数需要注意几个要点:

  1. 递归函数必须有一个或多个基本情况(base case),这些情况是递归的终止条件。如果没有基本情况,函数将进入死循环,无限递归下去,导致堆栈溢出错误。
js">//无递归出口
function fn(){			
	console.log(‘你好’);		
	fn();				
}
fn();					
  1. 递归函数在调用自身时,每次调用的信息会被存储在调用栈(Call Stack)中,直到遇到基本情况退出递归,然后逐级返回结果。因此,对于大数据量的递归,要小心栈空间的限制。
  2. 在某些情况下,可以使用尾递归优化,现代JavaScript引擎(如V8)支持尾递归优化,能够减少栈空间的占用。尾递归是指在函数返回的时候,调用自身本身,并且return语句不能包含表达式(即函数必须是最后一句)。但并非所有递归都适用于尾递归优化。

http://www.niftyadmin.cn/n/5457863.html

相关文章

pulsar: kafka on pulsar之把pulsar当kafka用

一、下载协议包(要和pulsar版本比较一致) https://github.com/streamnative/kop/releases?q2.8.0&expandedtrue二、在pulsar的根目录创建一个protocols目录,将上述包放到这个目录里 三、编辑broker.conf(如果是集群)或者standalone.con…

网络编程(三要素 ,IP、端口、协议)

二、网络三要素: 2.1 IP地址 接下来,我们详细介绍一下IP地址。IP(Ineternet Protocol)全称互联网协议地址,是分配给网络设备的唯一表示。IP地址分为:IPV4地址、IPV6地址 IPV4地址由32个比特位&#xff0…

小狐狸JSON-RPC:钱包连接,断开连接,监听地址改变

detect-metamask 创建连接,并监听钱包切换 一、连接钱包,切换地址(监听地址切换),断开连接 使用npm安装 metamask/detect-provider在您的项目目录中: npm i metamask/detect-providerimport detectEthereu…

猫,路由器,WIFI

家庭网络常识 1:猫、路由器、wifi_哔哩哔哩_bilibili 入户光纤插到猫上面,网线连接猫和路由器,网线连接路由器和电脑。路由器可以发射WIFI。 手机通过WIFI连接到路由器。 左边是猫,右边是光猫。 (modem) …

el-tree 树形控件

<el-tree :indent"5" // 相邻级节点间的水平缩进&#xff0c;单位为像素:props"defaultProps" ref"tree" :data"leftList":default-expanded-keys"defaultExpandedArr" // 设置默认展开指定节点 存储默认选中节点对应的…

动态系统稳定性【1】-矩阵特征值有什么用?微分方程稳定性方法概论和谱半径、Lyapunov判定

动态系统稳定性【1】-微分方程稳定性方法概论和谱半径、Lyapunov判定 1. 稳定性分析方法概论2. 微分方程稳定性的谱半径分析方法2. 1 矩阵谱半径求解matlab实现2.2 基于传递矩阵谱半径的稳定性的局限性3. 李雅普诺夫稳定性分析方法3.1 李雅普诺夫直接法(第1方法)3.2 李雅普诺…

Spring用到了哪些设计模式?

目录 Spring 框架中⽤到了哪些设计模式&#xff1f;工厂模式单例模式1.饿汉式&#xff0c;线程安全2.懒汉式&#xff0c;线程不安全3.懒汉式&#xff0c;线程安全4.双重检查锁&#xff08;DCL&#xff0c; 即 double-checked locking&#xff09;5.静态内部类6.枚举单例 代理模…

在 Linux/Ubuntu/Debian中创建、复制和删除文件和目录

要在 Linux 中创建、复制和删除文件和目录&#xff0c;可以使用各种命令。 以下是一些常用的&#xff1a; 1、创建目录&#xff1a; mkdir 目录名创建目录层次结构&#xff1a; mkdir -p 目录路径/子目录创建文件&#xff1a; touch 文件名4.复制文件&#xff1a; cp 源文件…