递归(Recursion)day01

5个高频棘手SQL查询实战:窗口函数、CTE递归与日期重叠检测 SQL高级查询能力是数据驱动业务的核心基础,其本质在于利用窗口函数、自连接、相关子查询、CTE递归和日期区间逻辑,在海量关联数据中实现精准、高效、强一致的实时计算。这些技术超越基础语法,直击电商订单分析、SaaS用户归因、金融风控筛查等真实场景中的性能瓶颈与逻辑陷阱。例如,DENSE_RANK()解决Top-N并列需求,WITH RECURSIVE应对无限层级推荐链,而闭区间重叠公式(a.start <= b.end AND b.start <= a.end)则规避三值逻辑导致的校验失效。掌握它们,意味着能 阅读详情

递归应用场景

迷宫问题(回溯),递归(Recursion)
在这里插入图片描述

递归概念

简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

递归调用机制

  • 打印问题
  • 阶乘问题
    在这里插入图片描述

递归能解决什么样的问题

    1. 各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)
  • 2)各 种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.
  • 3)将用栈解决的问题–>递归代码比较简洁

递归需要遵守的重要规则

递归需要遵守的重要规则
1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2)方法的局部变量是独立的,不会相互影响,比如n变量
3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.
4)递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError。
5) 当一个方法执行完毕,或者遇到return, 就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕

递归-迷宫问题

在这里插入图片描述

package com.xhl.recursion;

public class MigGong {

	public static void main(String[] args) {
		// 创建一个二维数组,模拟迷宫
		// 地图
		int[][] map = new int[8][7];
		// 使用1表示墙
		// 上下全部设置为1
		for (int i = 0; i < 7; i++) {
			map[0][i] = 1;
			map[7][i] = 1;
		}
		// 左右全部设置为1
		for (int i = 0; i < 8; i++) {
			map[i][0] = 1;
			map[i][6] = 1;
		}

		// 设置挡板
		map[3][1] = 1;
		map[3][2] = 1;
//		map[1][2] = 1;
		map[2][2] = 1;

		// 输出地图
		System.out.println("地图情况");
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 7; j++) {
				System.out.printf("%d\t", map[i][j]);
			}
			System.out.println();
		}

		// 使用递归回溯给小球找路
		setWay(map, 1, 1);

		// 输出地图
		System.out.println("小球走过地图情况");
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 7; j++) {
				System.out.printf("%d\t", map[i][j]);
			}
			System.out.println();
		}


	}
//	递归小球找路
	/*
	 * 1、map表示地图
	 * 2、i,j表示从地图哪个位置出发
	 * 3、如果小球能到map【6】【5】位置,则说明通路找到
	 * 4、约定:当map【i】【j】为0表示该点没有走过 当为1表示墙  2表示通路可以走
	 *   3表示该点已经走过但是走不通。
	 * 5、走迷宫的策略(方法)下-》右-》上-》左,如果该点走不通,再回溯
	 */
	private static boolean setWay(int[][] map, int i, int j) {
		if(map[6][5]==2) {
			return true;
		}else {
			if(map[i][j]==0) {//如果当时这个的点还没有走过
				//按策略 下 右 上 左
				map[i][j]=2;
				if(setWay(map, i+1, j)) {
					return true;
				}else if(setWay(map, i, j+1)){
					return true;
				}else if(setWay(map, i-1, j)){
					return true;
				}else if(setWay(map, i, j-1)){
					return true;
				}else {
					map[i][j]=3;//该点是死路,走不通
					return false;
				}
			}else {//map[i][j]!=0,可能为1、2、3;
				return false;
			}
		}
	}

}

在这里插入图片描述

  • 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关
  • 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是有变化的
  • 测试回溯现象

递归-八皇后问题

问题描述

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。

思路分析

  1. 第一个皇后先放第一行第一列
  2. 第二个皇后放在第二行第一列、然后判断是否OK,如果不0K, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适
  3. 继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
  4. 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一-列的所有正确解,全部得到.
  5. 然后回头继续第一个皇后放第二列,后面继续循环执行123,4 的步骤
  6. 示意图:

在这里插入图片描述

  • 理论.上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题.ar[8]={0,4, 7,5,2,6, 1,3} //对应arr 下标表示第几行,即第几个皇后,arr[i]=val, val 表示第i+1个皇后,放在第i+1行的第va1+1列
package com.xhl.recursion;

public class Queue8 {
	//定义一个max表示一共有多少皇后
	int max = 8;
	//定义一个array数组,保存皇后放置位置的结果
	int[] array = new int[max];
	static int count=0;
	static int judgecount=0;
	
	public static void main(String[] args) {
		Queue8 queue8 = new Queue8();
		queue8.check(0);
		System.out.printf("一共有%d种解法\t",count);
		System.out.printf("一共判断冲突%d次",judgecount);
	}
	
	//放置第n个皇后
	//check是每一次递归时,进入到check中都有for(int i=0;i<max;i++),因此会有回溯
	private void check(int n) {
		if(n==max) {
			//8个皇后已经放好
			print();
			return ;
		}
		//一次放入皇后,并判断是否冲突
		for(int i=0;i<max;i++) {
			//先把当前的皇后n,放入该行的第一列,判断是否冲突,如果不冲突
			//就可以开始放第n+1皇后
			array[n]=i;
			if(judge(n)) {
				check(n+1);
			}
		}
	}

	//检查放置的第n个皇后是否与之前摆放的皇后冲突
	
	private boolean judge(int n) {
		judgecount++;
		for(int i=0;i<n;i++) {
			if(array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])) {
				return false;
			}
		}
		return true;
	}

	//打印
	private void print() {
		count++;
		for(int i=0;i<max;i++) {
			System.out.printf("%d\t",array[i]);
		}
		System.out.println();
		
	}
}

在这里插入图片描述

CTE不是语法糖:T-SQL结构化思维与生产级避坑指南 公用表表达式(CTE)是SQL Server中用于逻辑分层、递归计算和可维护性提升的核心结构化工具,其本质是命名的临时结果集而非物理存储,不缓存数据但显著改善查询可读性与调试效率。相比视图和临时表,CTE在递归处理、多引用复用、作用域隔离方面具备不可替代性,尤其适用于用户行为路径分析、BOM物料爆炸、组织架构遍历等典型场景。掌握CTE的执行计划特征、命名规范、MAXRECURSION控制及与窗口函数/表值函数协同技巧,能有效规避生产环境中的死循环、性能骤降与字段污染等高频问题。 阅读详情

相关推荐

SQL子查询性能优化:从执行原理到避坑实战

子查询是SQL中最基础却最易引发性能问题的结构,其本质并非语法嵌套,而是执行计划中的独立节点。理解标量子查询、相关子查询、表子查询和行子查询的底层执行差异,有助于规避物化开销、N×M次扫描及NULL逻辑陷阱等典型问题。现代数据库优化器会尝试将非相关子查询重写为JOIN以提升效率,但相关子查询必须依赖索引驱动的半连接(如EXISTS)才能保障性能。在电商、SaaS和金融等高并发场景中,合理选用EXISTS替代IN、LATERAL替代关联子查询、窗口函数替代标量子查询,可实现数十倍性能提升。本文聚焦真实故障复盘

chengyixian7877的博客 294

Java中的递归(recursion)方法----简单介绍加演示

递归方法简介: 一个方法体内调用它自身 方法递归包含了一中隐式循环,它会重复执行某段代码,但是这种执行无需循环控制。 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。 1.用递归求一个1-100的和 package demo; public class demo1 { public static void main(String[] args) { int n=100; demo1 demo1 = new demo1();

路宇的博客 4572

MySQL中获取指定日期区间内所有日期

在数据库应用开发中,经常需要根据给定的日期范围获取区间内的每一天日期,这对于统计分析、报表生成、任务调度等领域至关重要。MySQL作为广泛应用的关系型数据库管理系统,提供了丰富的日期函数和查询技巧来实现这一需求。本文将深入探讨如何在MySQL中获取指定日期区间的全部日期,并通过示例代码展示其实现方法,同时讨论性能考量和最佳实践。

Programming Talk 1424

File、递归(recursion)

一、File 1.1 简介 1.文件和目录路径名的抽象表示形式 File表示就是文件对象 2.路径:绝对路径与相对路径 3.绝对路径:从根盘符开始的路径就是绝对路径 例子: D:\day18\src\com\qf\test01\Text.class 4.相对路径:相对于某一个参照物的路径 idea 中使用的就是相对路径 1.2 常用的构造方法 方法名称 方法描述 public Fi...

多多鱼的博客 70

用c++生成随机迷宫_自动生成随机迷宫(1)prim算法

“程序 = 数据 + 算法”,一款好的作品不单单是代码的堆砌,还有其灵魂的部分,那就是算法;算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。算法既然是解决某类型问题的规范,那么我们就学习它,并在我们的作品中使用它。从这一期开始做一个迷宫系列,包括用算法生成随机迷宫,用算法自动寻址走迷宫。 三大迷宫生成算法之一“随机Prim算法不是...

weixin_31787547的博客 2596

ZYNQ实战:PS端驱动DMA实现高效数据流转与验证

本文详细介绍了在ZYNQ平台上通过PS端驱动DMA实现高效数据流转的实战方法。从ZYNQ的PS与PL数据交互基础出发,深入解析DMA核心价值,包括硬件平台搭建、Vivado配置、PS端软件架构设计及性能优化技巧,帮助开发者提升数据传输效率与系统性能。

weixin_29192141的博客 436

递归(recursion)实现案例

递归case

Jinber_H的博客 381

TLS回调函数–一文看懂(详)

TLS回调函数 CTF RE

Joyce_hjll的博客 3730

MySQL 递归 CTE 报错 3636 全解析:1001 次迭代的真相与三种解决方案

MySQL递归CTE生成时间序列时,当递归步数超过默认1000次限制会报错3636。本文提供三种解决方案:1)临时调高递归上限参数(最快但不稳定);2)重构SQL将递归拆分为按天递归+固定时段序列(推荐方案);3)使用预置数字表或日历表(适合长期工程化)。推荐方案B通过拆分递归链,将1056次递归降为22天+48段的组合,既保证结果又避免超限,无需依赖环境配置。

qq_41924536的博客 469

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

2、探索谷歌云平台(GCP):入门指南

本文全面介绍了谷歌云平台(GCP)的入门知识,涵盖其全球基础设施、核心服务和使用方法。内容包括GCP区域与可用区结构、创建免费账户、配置计算资源(如GCE虚拟机)、存储类型(PD、Filestore、GCS)、网络架构(VPC)、组织与项目管理、身份访问控制(IAM),以及计算、存储、数据库、大数据和人工智能等各类云服务。文章还提供了资源规划、安全管理和成本控制等实用建议,帮助用户快速上手并高效利用GCP构建可扩展的云解决方案。

uber9的博客 255

【Java学习笔记】递归

【Java学习笔记】递归

在csdn分享更多技术知识,相互交流 807

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

python递归函数实例-python递归函数

python递归函数什么是递归?递归,就是在函数运行中自己调用自己代码示例:def recursion(n): # 定义递归函数print(n) # 打印nrecursion(n+1) # 在函数的运行种调用递归recursion(1) # 调用函数这个函数在不断的自己调用自己,每次调用n+1,看下运行结果:12.....998Traceback (most recent call las...

weixin_39690625的博客 434

34、实数域上高效负循环卷积算法解析

本文介绍了一种高效的实数域负循环卷积算法,通过引入离散傅里叶负循环变换(DFNT)避免传统方法的冗余,显著提升计算效率。文章详细分析了算法原理、误差传播机制,并推导出误差与方差界,提出无误差和基于3σ规则的参数设置方案。结合Cooley-Tukey与Gentleman-Sande FFT路径优化,实验验证了算法在不同精度和多项式长度下的性能优势与结果正确性,为密码学与信号处理等领域提供了高精度、高性能的卷积计算解决方案。

salt的博客 114

第 13 章:Spring AI Alibaba MCP 与 Nacos3 — 企业级MCP服务

理解Spring AI Alibaba 框架下的MCP服务与Nacos注册中心整合的必要性,学会Spring AI Alibaba-基于Nacos的MCP实现方法

paopao_wu的专栏 788

2021-03-24:java第23天:File类,递归recursion

1.File类 File.Seperator方法 package Part2.Day_23; import java.io.File; /* java.io.File类 文件和目录路径名的抽象表示形式 java把电脑中的文件和文件夹封装为了一个File类 我们可以使用File类的方法 创建文件夹/文件 删除文件夹/文件 获取文件/文件夹 判断文件/文件夹是否存在 对文件夹进行遍历 .

qq_41179957的博客 166

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Day24 BackTracking part01

segment: given Stringsubset: arrange:combination:chessboard:Backtracking methods can be abstracted as a tree, and the width of the tree is the size of the set.The template of the backtracking method: Combinations

qq_44763553的博客 469

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

韩顺平-递归使用

猴子吃桃子

yangqiqi1997的博客 228

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

> 3636 - Recursive query aborted after 1001 iterations. Try increasing @@cte_max_recursion_depth to

想要自动生成2018-2021之间,3年的日期在一个新表中,但是无奈报错具体的SQL代码见 解决方案 非常奇怪的一点是,生成20180101-20180101是不会报错的 但是生成20180101-20210101就会报错 佛了 在网上找相关的报错解决方式都好像很复杂 所以不然就生成两个表最后再union吧 猫猫叹气

qq_41251196的博客 2894

SQL 进阶必会:用 `WITH RECURSIVE` 一键搞定无限层级组织架构

递归 CTE是 SQL 语言图灵完备性的体现。它让我们在不脱离 SQL 上下文、不使用外部脚本的情况下,具备了**“凭空造数”和“无限钻取”**的能力。下次再遇到需要写WHILE。

郑龙飞 1318

SQL WITH 子句(CTE)性能优化实战:3种场景对比与 30% 查询效率提升

本文深入探讨SQL WITH子句(CTE)的性能优化实战,通过3种典型场景对比展示如何提升查询效率达30%。内容涵盖CTE执行机制、递归查询深度控制、跨数据库优化策略及高级技巧,帮助开发者掌握PostgreSQL和MySQL中的CTE优化方法,显著提升复杂SQL查询性能。

1066

SQL原生批量生成百万级业务测试数据实战

SQL批量插入是数据库性能优化与测试验证的基础能力,其核心在于理解数据生成的执行范式:从客户端串行提交转向服务端内存计算。递归CTE、generate_series、INSERT SELECT等原生机制,通过消除网络往返和WAL高频刷盘,实现百倍级性能跃升;结合RANDOM()向量化计算、CASE业务规则嵌入与时间/金额分布模拟,可生成具备真实语义的活数据。该技术广泛应用于SQL练手、索引调优、执行计划分析及CI/CD自动化测试等工程场景,是DBA、数据工程师与SQL开发者必须掌握的‘数据工厂’底层能力。

weixin_34056162的博客 382

PHP面试逆袭指南:如何用PHP-Data-Structure-and-Algorithms系统刷透数据结构与算法面试题

> PHP 开发者被"问到算法就懵"?开源项目 **PHP-Data-Structure-and-Algorithms** 用纯 PHP 实现了 10 大类、40+ 个数据结构与算法,从链表、栈、队列到图算法、动态规划,全部配可运行的示例代码。跟着它的目录结构刷一遍,数据结构与算法面试题不再难。 ## 🎯 为什么PHP开发者必须啃下数据结构与算法? 面试中,"手写链表反转""二叉树遍历""0

gitblog_01092的博客 263

多维聚合实战:超越GROUP BY的SQL数据操作原语

多维聚合是BI分析与数据中台建设中的核心能力,其本质是在高维坐标系中对数据进行裁剪、折叠、展开与补全等拓扑操作。不同于单维度GROUP BY的静态分组,现代多维分析需结合CUBE/ROLLUP实现维度组合自动枚举,利用窗口函数在聚合结果上二次计算,通过GENERATE_SERIES或arrayJoin完成时间/标签类动态维度补全,并借助递归CTE穿透地理或组织层级。这些技术共同支撑稀疏矩阵填充、聚合下推与维度钻取等关键场景,广泛应用于电商销售归因、客户分群建模及实时看板开发。本文聚焦PostgreSQL与C

weixin_30414305的博客 437

MySQL触发器实战:高并发场景下的审计、校验与避坑指南

SQL触发器是数据库事务中不可分割的逻辑扩展机制,其核心原理在于与宿主DML语句共享同一事务上下文,具备BEFORE拦截校验和AFTER日志联动的技术价值。在金融、电商等强一致性要求的生产环境中,它被广泛用于数据审计、业务规则守门、变更追踪等关键场景。本文聚焦MySQL 8.0真实高并发案例(如orders表日均20万DML),详解触发器设计规范、JSON审计建模、灰度上线策略及递归调用、时间函数、权限控制等高频陷阱,帮助开发者规避‘凌晨三点被叫醒’的线上事故。

aizexi2652的博客 431
上一篇: 栈(Stack)day04
下一篇: 创建型——原型模式(Prototype)day05
哆唻咪à
博客等级 码龄9年 0粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值