1.迭代与递归 - JS

news2024/11/15 8:51:02

迭代与递归是函数进阶的第一个门槛。迭代就是对已知变量反复赋值变换;递归就是函数体内调用自身。

迭代

一个迭代是就是一个循环,根据迭代式对变量反复赋值。

  1. 求近似根(切线法);
    在这里插入图片描述

迭代描述:

  • x 0 x_0 x0,初始估计
  • x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) x_1 = x_0 - \frac{f(x_0)}{f^{'}(x_0)} x1=x0f(x0)f(x0)
  • x 2 = x 1 − f ( x 1 ) f ′ ( x 1 ) x_2 = x_1 - \frac{f(x_1)}{f^{'}(x_1)} x2=x1f(x1)f(x1) ……
  • x n = x n − 1 − f ( x n − 1 ) f ′ ( x n − 1 ) x_n = x_{n-1} - \frac{f(x_{n-1})}{f^{'}(x_{n-1})} xn=xn1f(xn1)f(xn1) ……
  • 直到满足一定精度要求。

下面是一个求一元二次方程的根的例子。

/* 求一元二次方程的根
* a, b, c 是方程系数; x0 是初始估计
*/
function root2([a, b, c], x0) {
	let fx0, dfdx0;
	while (1) {
		fx0 = a*x0*x0 + b*x0 + c;
		if (Math.abs(fx0) < 1e-6) break;
		dfdx0 = 2*a*x0 + b;
		x0 = x0 - fx0 / dfdx0;
	}
	return x0;
}

let eq = [2, 3, 1], x0 = 0;
root2(eq, x0)	// -0.499999
  1. 斐波那契数列
  • f 0 = 0 , f 1 = 1 f0 = 0, f1 = 1 f0=0,f1=1
  • f 2 = f 1 + f 0 f2 = f1 + f0 f2=f1+f0
  • f 3 = f 2 + f 1 … … f3 = f2 + f1 …… f3=f2+f1……
function fib(n) {
	n = +n;
	let i = 0;
	let f0 = 0, f1 = 1;
	while (i < n) {
		[f0, f1] = [f1, f0 + f1];
		i++;
	}
	return f0;
}

fib(0)	// 0
fib(1)	// 1
fib(2)	// 1
fib(3)	// 2
fib(8)	// 21

递归

递归就是在函数体内调用自身。在函数体中调用自身至少有以下三种方式:

  1. 函数名;
  2. arguments.callee
  3. 作用域内一个指向该函数的变量名;
function fac(n) {
	if (n <= 1) return 1;
	else return n * fac(n - 1);
}

function fac(n) {
	if (n <= 1) return 1;
	else return n * arguments.callee(n - 1);
}

let factorial = function fac(n) {
	if (n <= 1) return 1;
	else return n * factorial(n - 1);
}
factorial(5)	// 120

基本要素

  • 递归出口:达到边界条件、停止递推、开始归返;
  • 递推公式:非边界条件、向更深处递推。

递归过程

  • 递推;
  • 归返。
4!=4*3!
3!=3*2!
2!=2*1!
return 1
return 2*fac(1)
return 3*fac(2)
return 4*fac(3)
1!
fac(1)
2!
fac(2)
3!
fac(3)
4!
fac(4)
result

优点缺点

  • 优点:
    • 实现简单;
    • 可读性高。
  • 缺点:
    • 空间利用率低;
    • 递归太深,栈溢出。

简单例子

  1. 阶乘
function fac(n) { 
	if (n == 0) return 1;		// 递归出口
	else return n * fac(n - 1);	// 递推公式
}

fac(4)		// 24
fac(170)	// 7.257415615307994e+306
fac(171)	// Infinity
  1. 斐波那契数列
function fib(n) {
	if (n <= 1) return 1;
	else return fib(n - 1) + fib(n - 2);
}

fib(0)	// 0
fib(1)	// 1
fib(2)	// 1
fib(3)	// 2
fib(8)	// 21

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

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

相关文章

安装并开始设置 Windows 终端(命令提示符或Windows PowerShell或Azure Cloud Shell)

安装 安装 若要试用最新的预览功能&#xff0c;可能还需要安装 Windows 终端预览。 ‼️备注 如果你无法访问 Microsoft Store&#xff0c;GitHub 发布页上发布有内部版本。 如果从 GitHub 安装&#xff0c;Windows 终端将不会自动更新为新版本。 有关使用包管理器&#xff…

品牌如何持续发展,重点在于把握消费动机

发展周期较短的品牌可能有很多原因&#xff0c;但是长效发展的品牌却有相似的共性。所有能长效发展的品牌&#xff0c;都牢牢把握住了顾客的消费动机&#xff0c;人们会因为很多原因去消费&#xff0c;这在营销界就被称为“消费动机”&#xff0c;有的消费动机是短暂的&#xf…

MySQL中的数据类型(五)

MySQL中的数据类型&#xff08;五&#xff09; 一、整数类型 数值类型中的长度 m 是指显示长度&#xff0c;并不表示存储长度&#xff0c;只有字段指定 zerofill 时有用 例如&#xff1a; int(3) &#xff0c;如果实际值是 2 &#xff0c;如果列指定了 zerofill &#xff0c;…

【UE 材质】球形遮罩材质

效果 步骤 1. 新建一个材质&#xff0c;这里命名为“M_Mask” 打开“M_Mask”&#xff0c;混合模式设置为已遮罩&#xff0c;勾选双面显示 在材质图表中添加如下节点 此时我们将一个物体赋予材质“M_Mask”并放置在世界坐标原点&#xff0c;可以看到如下效果 2. 如果我们希望能…

C++ 类与对象(中)

本节目标 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认…

【golang】13、viper 配置库 | 配置文件读写 | 使用方式 | 源码逻辑分析

文章目录 一、使用方式1.1 特性1.2 优势1.3 设置1.3.1 默认值1.3.2 配置文件1.3.3 写配置文件1.3.4 监听配置文件变化1.3.5 从 io.Reader 读配置1.3.6 Setting Overrides1.3.7 使用 Alias1.3.8 环境变量1.3.9 命令行 Flags1.3.8.1 Flag 接口 1.3.9 配置中心1.3.9.1 未加密1.3.9…

RabbitMQ(一):最新版rabbitmq安装

目录 1 简介1.1特性及好处 2 安装2.1 Ubuntu22.04 apt安装最新rabbitmq1、一键部署2、验证3、RabbitMQWeb管理界面及授权操作4、添加远程用户5、一些常用命令 2.2 Docker安装RabbitMQ - Ubuntu22.041、安装docker2、启动rabbitmq 1 简介 RabbitMQ是一个开源的遵循AMQP协议实现…

多模态大模型综述整理

论文&#xff1a;MM-LLMs: Recent Advances in MultiModal Large Language Models 论文地址&#xff1a; https://arxiv.org/pdf/2401.13601.pdf 表1&#xff1a;26种主流多模态大型语言模型&#xff08;MM-LLMs&#xff09;概要 输入到输出模态&#xff08;I→O&#xff09;…

Sentinel 知识总结

Sentinel 知识总结 Sentinel 是阿里巴巴开源的一个轻量级流量控制框架&#xff0c;主要用于保护系统稳定性和流畅性。它提供了多种流量控制策略&#xff0c;包括QPS限流、并发数限流、线程池限流等&#xff0c;并且支持集群限流。此外&#xff0c;Sentinel还提供了熔断降级、系…

机器学习 | 掌握线性回归的实战技巧

目录 初识线性回归 损失和优化 欠拟合与过拟合 正则化线性模型 模型的保存与加载 初识线性回归 线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是&#xff1a;有一个自变量的情况称为单…

Linux实验记录:使用firewalld

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

【百度Apollo】循迹自动驾驶:探索基于视觉感知的路径规划与控制技术

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

牛啊!能透视大模型内部结构的可视化工具!

哈喽&#xff0c;大家好。 今天给大家分享一个非常牛逼的可视化工具&#xff0c;可以清晰了解 GPT 大模型内部的结构。 哦&#xff0c;对了&#xff01;给大家准备了国内用的 ChatGPT key&#xff0c;见评论区。 这个工具可以支持查看 GPT2 和 GPT3 的网络架构。 但能进行交互…

区间时间检索

参数形式 sql <if test"params.beginOrderDate ! null and params.beginOrderDate ! "><!-- 开始时间检索 -->AND DATEDIFF(day,#{params.beginOrderDate},b.order_date) > 0</if><if test"params.endOrderDate ! null and params.endO…

ov通配符ssl证书申请时间长吗

通配符SSL证书是SSL数字证书的一种&#xff0c;可以同时保护主域名以及同一个域名下的所有子域名。用户在申请通配符SSL证书时需要CA认证机构对提交的信息进行审核&#xff0c;审核时间根据证书的品牌、类型而变化。今天就随SSL盾小编了解OV通配符SSL证书申请时间。 1.通配符S…

蓝桥杯 第 2 场 小白入门赛

目录 1.蓝桥小课堂-平方和 2.房顶漏水啦 3.质数王国 4.取余 5.数学尖子生 6.魔术师 比赛链接 1.蓝桥小课堂-平方和 简单签到直接按照题目处理即可注意开long long void solve(){LL x; cin>>x;LL ans x*(x1)*(2*x1)/6;cout<<ans<<endl; } 2.房顶漏水…

STM32——DMA

STM32——DMA 1.DMA介绍 什么是DMA&#xff1f; DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&…

C语言应用实例——贪吃蛇

&#xff08;图片由AI生成&#xff09; 0.贪吃蛇游戏背景 贪吃蛇游戏&#xff0c;最早可以追溯到1976年的“Blockade”游戏&#xff0c;是电子游戏历史上的一个经典。在这款游戏中&#xff0c;玩家操作一个不断增长的蛇&#xff0c;目标是吃掉出现在屏幕上的食物&#xff0c…

shell - 免交互

一.Here Document 免交互 1. 交互的概念 交互&#xff1a;当计算机播放某多媒体程序的时候&#xff0c;编程人员可以发出指令控制该程序的运行&#xff0c;而不是程序单方面执行下去&#xff0c;程序在接受到编程人员相应的指令后而相应地做出反应。 对于Linux操作系统中&…

【RT-DETR有效改进】Bi-FPN高效的双向特征金字塔网络(附yaml文件+完整代码)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是BiFPN双向特征金字塔网络,其是一种特征融合层的结构,也就是我们本文改进RT-DETR模型中的Neck部分,它的主要思想是通过多层级的特征金字塔和双向信息传递来提高精度。本文给大家带…