19-递归的理解、场景

news2024/11/24 19:08:22

一、递归

🌭🌭🌭在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

核心思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

一般来说,递归需要有边界条件、递归前进阶段和递归返回阶段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回

下面实现一个函数 pow(x, n),它可以计算 x 的 n 次方

function pow(x,n){
	let result = 1;
	for(let i = 0;i < n;i++){
		result = result * x;	
	}
	return result;
}

递归的方式

function pow(x,n){
	if(n == 1){
		return x;
	}else{
		return x * pow(x,n - 1)	
	}
}

pow(x,n)被调用时,执行分为两个分支

在这里插入图片描述
也就是说 pow 递归地调用自身 直到 n == 1

在这里插入图片描述
计算 pow(2,4),递归变体经过以下步骤:

pow(2,4) = 2 * pow(2,3)
pow(2,3) = 2 * pow(2,2)
pow(2,2) = 2 * pow(2,1)
pow(2,1) = 2

递归将函数调用简化为一个更简单的函数调用,然后再将其简化为一个更简单的函数,以此类推,直到结果

二、尾递归

尾递归,即在函数尾位置调用自身。一种特殊情形,即在尾部直接调用自身

特征:

  • 在尾部调用的是 函数自身
  • 可通过优化,使得计算仅占用常量栈空间

在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出

这时候,我们就可以使用尾递归,即一个函数中所有递归形式的调用都出现在函数的末尾,对于尾递归来说,由于只存在一个调用记录,所以永远不会发生"栈溢出"错误

实现一下阶乘,如果用普通的递归,如下

function factorial(n){
	if(n === 1) return 1;
	return n * factorial(n - 1);
}
factorial(5)

如果n等于5,这个方法要执行5次,才返回最终的计算表达式,这样每次都要保存这个方法,就容易造成栈溢出

如果我们使用尾递归

function factorial(n,total){
	if(n === 1) return total;
	return factorial(n - 1,n * total);
}
factorial(5,1)

可以看到,每一次返回的就是一个新的函数,不带上一个函数的参数,也就不需要储存上一个函数了。尾递归只需要保存一个调用栈

二、应用场景

数组求和:

const arr = [1,2,3]
function sumArray(arr,total){
	if(arr.length === 1){
		return total
	}
	return sumArray(arr,total + arr.pop())
}
sumArray(arr,1)
// 数组扁平化
let a = [1,2,3, [1,2,3, [1,2,3]]];
// 变成 [1,2,3,1,2,3,1,2,3]
function flat(arr = [],result = []){
	arr.forEach(v =>{
			if(Array.isArray(v)){
			   result = result.concat(flat(v,[]))
		}else{
			result.push(v)	
		}
	})
	return result
}

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

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

相关文章

Azure-FunctionApp入门实战

介绍 FuntionApp 是微软云推出的一款serverless产品服务&#xff0c;作为coder可以无需关心程序部署所需的infra信息&#xff0c;只需要focus自己的业务代码实现即可 使用场景 是不是所有的业务都可以使用serverless产品呢&#xff1f;理论上是可以的&#xff0c;但是从实际…

初识mysql数据库之mysql数据库安装(centos)

目录 一、卸载不需要的环境 二、安装mysql yum源 三、安装mysql 四、登录mysql 1. 直接登录 2. 设置免密码登录 五、配置my.cnf 六、mysql登录时的一些选项介绍 一、卸载不需要的环境 要注意&#xff0c;在安装mysql数据库时&#xff0c;最好将用户切换为root&#xf…

Maven配置仓库、阿里云镜像、环境变量(史上最全最详细)

Maven配置仓库、阿里云镜像、环境变量&#xff08;史上最全最详细&#xff09; 一、前言 为了解决在maven的pom.xml文件中填入了某个依赖以后&#xff0c;maven却一直在转圈&#xff0c;非常慢的情况&#xff0c;我们需要进行配置阿里云镜像&#xff0c;这样会提升开发速度。…

Yolov5/Yolov7优化:引入Soft-NMS,提升密集遮挡场景检测精度

1.Soft-NMS介绍 论文地址:https://arxiv.org/pdf/1704.04503.pdf NMS需要优化的参数: IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。 R-CNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率: 就…

解密车载SOA架构原理,构建汽车通信的核心技术

车载SOA架构原理 车载SOA架构&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种设计思想&#xff0c;旨在构建可扩展、灵活和可维护的车载系统。以下是车载SOA架构的一些原理和特点&#xff1a; 服务导向&#xff1a;车载SOA架构将车载…

探索ChatGPT:了解语言模型在对话系统中的应用

第一章&#xff1a;引言 在当今数字化时代&#xff0c;人工智能技术的迅猛发展使得对话系统成为一个备受关注的领域。随着语言模型的进步&#xff0c;像ChatGPT这样的模型正在改变我们与计算机进行交流的方式。本文将探索ChatGPT作为一种语言模型在对话系统中的应用&#xff0…

数据结构——顺序表(万字讲解)

单向链表&#xff08;又名单链表、线性链表&#xff09;是链表的一种&#xff0c;其特点是链表的链接方向是单向的&#xff0c;对链表的访问要通过从头部开始&#xff0c;依序往下读取。 //单链表的打印 void SLTPrint(SLTNode* phead) {SLTNode* cur phead;while (cur){pri…

python:使用Scikit-image库对单波段遥感图像做纹理特征提取(texture)

作者:CSDN @ _养乐多_ 本文将介绍使用Scikit-image库对单波段遥感图像做纹理特征提取的代码。包括:计算灰度共生矩阵(greycomatrix),计算局部二值模式(LBP)特征,计算方向梯度直方图(HOG)特征,使用Gabor滤波器提取纹理特征,计算图像纹理能量,在不同尺度上计算图像…

Android问题笔记-集成AndroidUSBCamera开源框架出现 “libjpeg-turbo1500.so“ not found

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

【干货】Android系统定制基础篇:第十五部分(Android支持鼠标右键返回、GPIO 控制方案、属性标识USB摄像头的VID与PID)

1、修改 frameworks/native/services/inputflinger/InputReader.cpp 如下&#xff1a; diff --git a/frameworks/native/services/inputflinger/InputReader.cpp b/frameworks/native/services/inputflinger/Inp index 7207a83..2721800 100755 --- a/frameworks/native/servi…

数字图像处理 基于matlab、opencv计算图像的梯度方向和梯度幅值

一、图像的梯度 1、简述 图像可以被视为标量场(即二维函数)。 通过微分将标量场转换为矢量场。 梯度是一个向量,描述了在x或y方向上移动时,图像变化的速度。我们使用导数来回答这样的问题,图像梯度的大小告诉图像变化的速度,而梯度的方向告诉图像变化最…

两轮车造爆款,爱玛的时尚战略胜算几何?

市场越卷&#xff0c;爆款的意义越大。 电动车行业就是这样&#xff08;本文仅指两轮电动车&#xff0c;如电动自行车、电动摩托车等出行工具&#xff09;&#xff0c;在CR2>45%、CR8>80%的市场格局下&#xff0c;行业竞争早已进入巷战阶段。 对头部的几个品牌&#xf…

leetcode 2090. K Radius Subarray Averages(半径为k的子数组的平均)

k半径长度的子数组表示以数组下标 i 为中心&#xff0c;[i-k, ik]范围内的子数组。 返回和数组nums一样长度的数组res&#xff0c;res[i] [i-k, ik]范围内的元素和 / 元素个数2k1 如果 i-k 或者 ik 超出了数组范围&#xff0c;res[i] -1. 思路&#xff1a; 如果[i - k, ik]…

荔枝集团出席扬帆出海PAGC 探讨AI在音频场景落地技术

近年来&#xff0c;中国企业的身影正不断活跃在全球商业版图上&#xff0c;无论是新兴技术的运用还是创新模式的尝试&#xff0c;其全球化的步履不停。近日,由扬帆出海主办的 2023产品与增长大会(简称PAGC)在广州广交会展馆召开&#xff0c;共同探索未来出海趋势和机遇&#xf…

6月20日作业

我实现的功能&#xff0c;执行一次应用程序led灯 亮&#xff0c;再次执行应用程序led灯灭。 内核模块&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h&…

中职网络搭建(服务器)—Linux LVM(标准答案)

题目要求如下 使用fdisk-l查看磁盘信息 我们添加的磁盘分别是sdb和sdc Fdisk /dev/sdb 依次输入n,p,1&#xff0c;回车,2G &#xff08;新建2G的主分区&#xff09; 依次输入n,e,2&#xff0c;回车&#xff0c;回车&#xff08;使用剩余的全部空间建立扩展分区&#xff09; 依…

软件工程——第2章可行性研究知识点整理

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.可行性研究的目的&#xff1f; 2.可行性研究的实质&#xff1f; 3.从哪些方面研究逻辑模型的解法可行性&#xff1f; 4.可行性研究最根本的任务是…

6个免费音效、配乐素材网站,无版权,可商用。

分享几个网站&#xff0c;配乐、音效素材都有&#xff0c;还是免费可商用的&#xff0c;希望能帮到大家&#xff0c;建议收藏起来~ 菜鸟图库 https://www.sucai999.com/audio.html?vNTYxMjky 虽然这是一个设计素材网站&#xff0c;但涵盖的素材非常广泛&#xff0c;想视频素材…

Git系列:运用Git创建空白分支进行项目相关文档管理

文章目录 起因一、为什么会选择Git分支二、Git分支的简单介绍和好处三、本次的具体操作1.$git checkout --orphan XXX2.删除当前分支里的内容3.提交新的分支 总结 起因 项目管理过程中没有做好相关文档管理&#xff0c;比如需求&#xff0c;开发&#xff0c;测试等文档&#x…

【Mysql】索引数据结构深入研究(一)

索引 1.什么是索引 数据库概论老师说&#xff1a;索引就是教科书的目录页&#xff0c;你要查哪个内容你就去目录页查询内容在哪。Mysql官网&#xff1a;索引是帮助Mysql高效获取数据的排好序的数据结构。 2.索引的数据结构 二叉树红黑树Hash表B-Tree 2.1 二叉树 我们先看…