19-递归的理解、场景

一、递归

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

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

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

下面实现一个函数 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
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法刷题-字符串-左旋转字符串

反转个字符串还有这么多用处&#xff1f; 题目&#xff1a;剑指Offer58-II.左旋转字符串 力扣题目链接 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如&#xff0c;输入字符串"abcdefg"和数字2…

generator和promise和async的异同

一、generator(生成器)是ES6标准引入的新数据类型,他和promise一样都是异步事件的解决方案 //generator函数生成斐波那契// generator(生成器)是ES6标准引入的新数据类型,async就是 Generator 函数的语法糖//本质&#xff1a;用来处理异步事件的对象/包含异步操作的容器functio…

校园外卖平台怎么做

校园外卖小程序是一款基于智能手机的移动应用&#xff0c;提供订餐、支付、配送等服务。它能为顾客提供丰富的美食选择&#xff0c;为商家提供进一步发展业务的机会&#xff0c;同时骑手也有机会赚取额外的收入。 一、 用户端功能介绍 1. 地图定位&#xff1a;用户可以利用小…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(中)

注意&#xff1a;本文由GPT4与Claude联合生成。 81、HammerScope: Observing DRAM Power Consumption Using Rowhammer 内存单元尺寸的不断缩小使得内存密度提高&#xff0c;功耗降低&#xff0c;但同时也影响了其可靠性。Rowhammer攻击利用这种降低的可靠性在内存中引发比特翻…

计算机网络基础学习指南

前言 计算机网络基础是研发/运维工程师都需掌握的知识&#xff0c;但往往会被忽略。 今天&#xff0c;我将对计算机网络基础学习进行详细阐述&#xff0c;涵盖 TCP / UDP协议、Http协议、Socket等&#xff0c;希望你们会喜欢。 1、计算机网络体系结构 1.1 简介 定义 计算机…

数据库的事务处理

文章目录 前言一、事务的概念二、事务的特性三、隔离级别四、并发控制五、总结 前言 在现代信息化时代&#xff0c;大量的数据不断地被创建、修改、删除和查询。 为了保证数据的准确性和一致性&#xff0c;数据库的事务处理成为了必不可少的一个重要组成部分。 本文将针对数据…

nginx学习使用

一、Nginx是什么&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第…

线性代数:线性方程求解、矩阵的逆、线性组合、线性独立

本文参考www.deeplearningbook.org一书第二章2.3 Identity and Inverse Matrices 2.4 Linear Dependence and Span 本文围绕线性方程求解依次介绍矩阵的逆、线性组合、线性独立等线性代数的基础知识点。 一、线性方程 本文主要围绕求解线性方程展开&#xff0c;我们先把线性…

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

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

【MySQL】数据库基础 ②

✍LIKE 子句 说明&#xff1a; 使用 SELECT 来查询数据&#xff0c; 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。 WHERE 子句中可以使用等号 来设定获取数据的条件&#xff0c;如 "字段(text_title) 值()"。 但是有时候我们需要获取 text_…

Dump寄存器使用、解析

前人种树&#xff0c;后人乘凉&#xff1b;创造不易&#xff0c;请勿迁移~ author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主daisy.skye擅长嵌入式,Qt,Linux,等方面的知识https://blog.csdn.net/qq_40715266?t…

Ubuntu18.04离线安装Nginx

因需要安装nginx的服务器无法连接互联网&#xff0c;所以需要离线安装。首先需要下载nginx的安装包&#xff0c;之后进行安装&#xff0c;在安装之前需要保证gcc&#xff0c;g&#xff0c;make等依赖包已经安装。 因为是需要离线安装&#xff0c;所以在之前是用的一台互联网下载…

selenium 要点击的元素被其他元素遮挡 or 无法找到非可视范围内的元素

selenium 无法找到非可视范围内的元素 org.openqa.selenium.StaleElementReferenceException: The element reference of is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed se…

Java实训日志06

文章目录 八、项目开发实现步骤&#xff08;八&#xff09;创建服务接口1、创建学校服务接口2、创建状态服务接口3、创建学生服务接口4、创建用户服务接口 &#xff08;九&#xff09;创建服务接口实现类1、创建学校服务接口实现类2、创建状态服务接口实现类3、创建学生服务接口…

【C++】4.工具:读取ini配置信息

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍读取ini配置信息。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

百度沈抖:大模型 产业智能化时代的新引擎

6月9日&#xff0c;2023 NAVIGATE领航者峰会在杭州举办&#xff0c;聚焦数字经济新政策、新技术、新业态带来的蓬勃机遇&#xff0c;探讨ICT行业在AIGC时代将要面临的全新挑战与应对策略。百度集团执行副总裁、百度智能云事业群总裁沈抖出席大会并作题为《大模型 产业智能化时代…

Elastic 8.8 版引入了全新的 Learned Sparse Encoder 模型,并宣布正式推出合成监测

作者&#xff1a;Brian Bergholm 2023年5月25日 今天&#xff0c;我们非常高兴地宣布 Elastic 8.8 版正式发布。 新增功能 Elastic 企业搜索可帮助开发人员利用 Elasticsearch 实现强大的现代搜索和发现体验。 请在 “Elastic 企业搜索亮点” 博文或 8.8 版发行说明中&#…

信息量、熵、联合熵、条件熵、相对熵、交叉熵、JS散度、Wasserstein距离

信息量 I ( x i ) l o g 1 P ( x i ) − l o g P ( x i ) I(x_i)log \frac {1}{P(x_i)}-logP(x_i) I(xi​)logP(xi​)1​−logP(xi​) 信息量&#xff08;self-information&#xff09;&#xff0c;又译为信息本体&#xff0c;由克劳德 香农&#xff08;Claude Shannon&…

小白也能玩转Docker:应用部署、迁移与备份

目录 1、应用部署 1.1、Mysql 1.2、Ngixn 1.3、Redis 1.4、RabbitMQ 1.5、Elasticsearch 1.6、Zookeeper 2、迁移与备份 2.1容器保存为镜像 2.2镜像备份 2.3镜像恢复与迁移 1、应用部署 1.1、Mysql 拉取mysql的镜像&#xff1a; docker pull mysql:5.7 为mysql镜…

孤立森林详解

基本概念 孤立森林&#xff08;Isolation Forest&#xff09;是一种基于异常检测的机器学习算法&#xff0c;用于识别数据集中的异常点。孤立森林算法在异常检测、网络入侵检测、金融欺诈检测等领域有广泛应用&#xff0c;并且在处理大规模数据和高维数据时表现出色。孤立森林…