递归与迭代

2023-11-14

迭代

迭代:迭代简单来讲就是循环:类比于我们循环输出某一个字符数组时的情景:从字符数组中不断取出字符,再将字符输出。迭代的循环过程则是从栈(或者队列)中不断取出要操作的元素,进行操作,与普通循环过程不同的是在不断取出元素的同时也会向栈中放入元素,从而实现迭代过程。因而迭代的要点有:迭代的初始条件,迭代过程中迭代元素生成,迭代结束条件判断。


在这里插入图片描述

迭代示例:

斐波那契数列
//迭代,时间复杂度O(n),空间复杂度O(1)
int fib2(int n)
{
	if (n < 2)
		return n;
	int n0 = 0, n1 = 1;
	int temp;
	for (int i = 2; i <= n; i++)
	{
		temp = n0;
		n0 = n1;
		n1 = temp + n1;
	}
	return n1;
}



递归

递归:递归简单来讲就是函数的自身调用:要实现这个过程,函数要包含循环的条件和调用自身的语句,通过这个不断自身调用的过程把问题不断化简,最终达到解决的目的。

在这里插入图片描述

递归类型:(主要分为递归产生返回值和递归处理引用入参这两种情形)

1.递归产生返回值
//示例1:斐波那契数列: 普通递归,时间复杂度O(2^n),空间复杂度O(n)
int fib(int n)
{
	if (n < 2)
		return n;
	return fib0(n - 1) + fib0(n - 2);
}

//示例2:验证数独九宫格的有效性 
class Solution {
public:
	bool isValidSudoku(vector<vector<char>>& board) {
		bool row [9][9]={false};   //row的index和num
		bool col [9][9]={false};	 //col的index和num
		bool block [9][9]={false}; //block的index和num
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (board[i][j] != '.') {
					int num = board[i][j] - '1';//数独中的1~9 在数组中作为0~8
					int blockindex = (i/ 3) * 3 + j / 3;
					if (row[i][num] || col[j][num] || block[blockindex][num])
						return false;
					row[i][num] = true;
					col[j][num] = true;
					block[blockindex][num] = true;
				}
			}
		}
		return true;
	}
};
2.递归处理入参(入参为引用的形式)
示例:给定一个没有重复数字的序列,返回其所有可能的全排列
class Solution {
public:
	vector<vector<int>> permute(vector<int>& nums) {
		if (nums.size() == 0)
			return vector<vector<int>>{};
		vector<vector<int>> res;
		func(nums,0,res);
		return res;
	}
	void func(vector<int> nums, int index, vector<vector<int>>& res){
		if (index == nums.size()-1) 
        {
            res.push_back(nums);
            return;
        }
		for (int i = index; i < nums.size(); i++){
			int temp = nums[index];
			nums[index] = nums[i];
			nums[i] = temp;
			func(nums, index + 1, res);
			temp = nums[index];
			nums[index] = nums[i];
			nums[i] = temp;
		}
	}
	
};


循环与遍历

循环: 循环和迭代的共同点在于,它们都是在描述一个多次操作。不同点在于,【循环】侧重于描述每次操作和上一次操作相同之处,而【迭代】侧重于描述每次操作和上一次操作的不同之处。

遍历: 遍历:依次对集合中的每个元素做且仅做一次访问。依次,代表具有某种顺序。比如二叉树有三种前序、中序、后序遍历。数组有顺序、逆序遍历等等。


区别

区别: 迭代大多是循环for\while的形式解决问题,函数内部主要是循环逻辑的处理。递归则是函数调用函数本身。迭代:循环结构,例如for,while循环。递归:选择结构,例如if else 调用自己,并在合适时机退出。迭代与普通循环的区别是:迭代时,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。递归与普通循环的区别是:循环是有去无回(比如循环打印),而递归则是有去有回(因为存在终止条件)。在循环的次数较大的时候,迭代的效率明显高于递归。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归与迭代 的相关文章

  • idea

    1 本人最近刚开始切换到 Intellij idea 发现一个问题 maven工程项目老是有红色下划线提示错误 Cannot Resolve Symbol 但是这些依赖都已经通过pom引进了 idea的Library中也能看到 试一下Fil

随机推荐

  • mysql 建表语句 及完整案例

    1 最简单的 表名为name info 只包含id列和name列 执行sql语句 CREATE TABLE name info id int not null name char 12 2 将id列设置为主键 执行sql语句 CREATE
  • 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文转载至 http www cnblogs com smyhvae p 4790373 html 本文主要内容 表达式的三种形式 中缀表达式与后缀表达式转换算法 一 表达式的三种形式 中缀表达式 运算符放在两个运算对象中间 如 2 1 3
  • 【华为OD机试真题 JS】火锅

    标题 火锅 时间限制 1秒 内存限制 262144K 语言限制 不限 入职后 导师会请你吃饭 你选择了火锅 火锅里会在不同时间下很多菜 不同食材要煮不同的时间 才能变得刚好合适 你希望吃到最多的刚好合适的菜 但是你的手速不够快 用m代表手速
  • [培训-无线通信基础-2]:无线电磁波传播机制(传播、衰减、链路预算)

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118667807 引言 既然无
  • vue crypto-js加解密

    1 安装crypto js npm install crypto js save 2 编写encrypt js const CryptoJS require crypto js import md5 from js md5 var key
  • 关于程序员【锁死】服务器

    干程序员这么多年 头一次听说 锁死 服务器这么个名词 乍一听到被媒体造的这个名词 觉着很突兀 自己念两遍就会感到头疼 恶心 想吐这么膈应 服务器到底是怎么 锁死 的 什么玩意 你看看人家 数据库系统概论 里面人家关于 锁 的一个翻译 死锁
  • ARM单片机通用IAP在线升级YMODEM协议

    ARM单片机通用IAP在线升级YMODEM协议 效果 YMODEM协议格式 移植修改接口 测试代码 代码获取 效果 YMODEM协议格式 接收开始流程 接收者1HZ发送接收状态 C C 代表字符 C 进入接收状态 发送者发送起始帧 SOH
  • 目标检测学习笔记+附入门资料+表面缺陷检测

    待更新补充 文章目录 放在最前 MARK入门阅读学习资料 一 目标检测基本概念 1 名词含义 目标检测 目标检测方法的分类 Bounding box 滑动窗口 R CNN步骤详解 交并比Interest over Union IoU 平均精
  • 对全连接层(fully connected layer)的通俗理解

    原文地址 https blog csdn net qq 39521554 article details 81385159 定义 全连接层 fully connected layers FC 在整个卷积神经网络中起到 分类器 的作用 如果说
  • matplotlib绘图

    孤影常伴灯 你在夜里写字 我在昏黄中布景 风吹皱那烟波浩渺的迷离 也想吹散关于你的记忆 你在红尘打坐 我在紫陌修佛 万般皆因果 何须嗔叹 闲来无事 索然无趣 忽而兴起 画几个简单的数据分析图 一 将数据生成柱状图 代码 coding utf
  • 【计算机网络】TCP/IP网络模型里这些问题你会吗

    零 为什么需要有TCP IP网络模型 不同设备的进程之间相互通信 需要网络通信 而设备存在多样性 需要兼容各种设备 从而协商出一套通用的网络协议 并且这个网络协议是分层的 每层都有各自的作用和职责 一 最上层是哪层 应用层 1 该层有哪些协
  • SQL 经典面试题:统计最近七天连续三天活跃的用户

    1 需求 给定 mid dt 的用户登录记录表 查找最近 7 天内连续 3 天活跃的用户 id 2 数据表 tmp table tmp login test CREATE TABLE tmp table tmp login test mid
  • 5G UE测量

    目录 系列文章目录 一 为何干测量 二 测量干了啥 三 何时干测量 四 用啥干测量 五 怎么干测量 如 以上就是今天要讲的内容 本文仅仅简单从缘由 结果 时机 原料 过程五个方面概述了5G UE测量大至的来龙去脉 一 为何测量 移动 性管理
  • 【hello Linux】进程信号

    目录 1 进程信号的引出及整体概况 2 信号的产生 1 键盘产生 2 进程异常 3 系统调用 4 软件条件 3 信号的保存 1 信号相关的常见概念 2 sigset t 3 信号集操作函数 4 sigprocmask 对block位图的操作
  • 5.4双积分ADC工作原理

    文章目录 1 高中几个知识点 exp n log n lgx lnx 电容充放电公式 2 双积分型ADC工作原理 3 SAR和 型模数转换器 ADC 1 高中几个知识点 exp n exp函数即指数函数 e的n次方的函数 自然常数e 2 7
  • Java 异常创建及控制

    最近在重新拾起Java 想开始分享一些自己的表达 就从这里开始了 Java中有一个Throwable类 它是所有异常或者说是违例的基础 包括了两种类型的异常 一种叫Error 表示的是编译器和系统错误 我们通常不需要去在意它们 另一种叫Ex
  • 国产版ChatGPT大盘点

    我们看到 最近 国内大厂开始密集发布类ChatGPT产品 一方面 是因为这是最近10年最大的趋势和机会 另一方面 国内的AI 不能别国外卡了脖子 那在类ChatGPT赛道上 哪些中国版的ChatGPT能快速顶上 都各有哪些困境需要突破呢 本
  • 第七周作业1

    1 调试分析课本每一个例题 有可能的话更改成2 3个方法的新程序 2 编程实现课本每一个编程习题 例5 1 include
  • LSM-Tree

    LSM Tree的设计思路是 将数据拆分为几百M大小的Segments 并是顺序写入 它的核心思路其实非常简单 就是假定内存足够大 因此不需要每次有数据更新就必须将数据写入到磁盘中 而可以先将最新的数据驻留在内存中 等到积累到最后多之后 再
  • 递归与迭代

    迭代 迭代 迭代简单来讲就是循环 类比于我们循环输出某一个字符数组时的情景 从字符数组中不断取出字符 再将字符输出 迭代的循环过程则是从栈 或者队列 中不断取出要操作的元素 进行操作 与普通循环过程不同的是在不断取出元素的同时也会向栈中放入