《算法设计与分析》之递归

算法分析与设计_2_递归算法设计技术 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归;若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。任何间接递归都可以等价地转换为直接递归。如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同递归调用的次数必须是有限的必须有结束递归的条件来终止递归示例:设计求n!(n为正整数)的递归算法。 阅读详情

目录

递归定义:

递归适用场景:

1、问题的定义是递归的:

2、存储数据的数据结构是递归的:

3、求解问题的方法是递归的:

递归的具体应用案例:

1、实现选择简单排序和冒泡排序:

2、 汉诺塔问题求解:

3、求解n皇后问题:


递归定义:

函数内部自己调用自己即为递归。

递归适用场景:

1、问题的定义是递归的:

如求n!,求斐波那契数列的第n项。

2、存储数据的数据结构是递归的:

如单链表,二叉树等。

3、求解问题的方法是递归的:

如汉诺塔。

递归的具体应用案例:

1、实现选择简单排序和冒泡排序:

简单选择排序定义:将整个数组分成有序区和无序区,初始时有序区为空,无序区为整个数组。每趟选择一个无序区的最小元素放入有序区中,最多进行n-1(假设数组长度为n)趟就能将数组从小到大排好序。

简单选择排序过程演示:

排序前:7        3        5        9        4        2

第一趟排序:2        3        5        9        4        7

第二趟排序:2        3        5        9        4        7

第三趟排序:2        3        4        9        5        7

第四趟排序:2        3        4        5        9        7

第五趟排序:2        3        4        5        7        9

简单排序算法展示(java):

package test;

public class Test {
	public static void main(String[] args) {
		int[] a= {7,3,5,9,4,2};
		sort(a,0);
		for(int i=0;i<a.length;i++)
			System.out.println(a[i]);
	}
	private static void sort(int[] nums,int start) {
		if(start==nums.length-1)
			return ;
		int min=nums[start];
		int k=start;
		for(int i=start;i<nums.length;i++)
			if(min>nums[i]) {
				min=nums[i];
				k=i;
			}
		if(k!=start) {
			int temp=nums[start];
			nums[start]=nums[k];
			nums[k]=temp;
		}
		sort(nums,start+1);
	}
}

冒泡排序定义:每趟排序只比较相邻的两个元素,小的放在前面,大的放在后面。最多进行n-1趟排序。

冒泡排序过程演示:

排序前:7        3        5        9        4        2

第一趟排序:3        5        7        4        2        9

第二趟排序:3        5        4        2        7        9

第三趟排序:3        4        2        5        7        9

第四趟排序:3        2        4        5        7        9

第五趟排序:2        3        4        5        7        9

冒泡排序算法展示:

package test;

public class Test {
	public static void main(String[] args) {
		int[] a= {7,3,5,9,4,2};
		sort(a);
		for(int i=0;i<a.length;i++)
			System.out.println(a[i]);
	}
	private static void sort(int[] nums) {
		boolean exchange=false;	//exchange用于判断数组nums是否已经有序,为退出递归的条件
		for(int i=0;i<nums.length-1;i++) {
			if(nums[i]>nums[i+1]) {
				exchange=true;
				int temp=nums[i];
				nums[i]=nums[i+1];
				nums[i+1]=temp;
			}
		}
		if(exchange)
			sort(nums);
	}
}

2、 汉诺塔问题求解:

问题描述:设有3个分别命名为x,y和z的塔座,在塔座x上有n个直径各不相同、从小到大依次编号为1~n的盘片,现要求将x塔座上的n个盘片移到塔座z上并按同样的顺序叠放。要求:1、每次只能移动一个盘片;2、盘片可以插在x,y和z中的任一塔座;3、任何时候都不能将一个较大的盘片放在较小的盘片上;4、输出移动的具体过程。

代码及注释展示:

package test;

public class Test2 {
	public static void main(String[] args) {
		char A='x',B='y',C='z';
		move(A,B,C,3);//move方法将A上的3个盘片都移动到C上
	}
	static int count=0;
	private static void move(char A,char B,char C,int n) {
		if(n==1)//如果刚好只有一个盘片,则直接移动
			System.out.println("第"+ ++count+"步:"+A+"->"+C);
		else {//如果不止一个盘片,则先将A上的n-1个盘片移动到B上,
			//再将A上剩余的一个盘片移动到C上,最后将B上的n-1个盘片移动到C上
			move(A,C,B,n-1);
			System.out.println("第"+ ++count+"步:"+A+"->"+C);
			move(B,A,C,n-1);
		}
		return ;
	}
}

3、求解n皇后问题:

LeetCode 第51题 N皇后

完整代码展示:

package leetcode_7;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class T_51 {
	static int[] q=new int[10];
	public static void main(String[] args) {
		System.out.println(solveNQueens(4));
	}
	public static List<List<String>> solveNQueens(int n) {
		List<List<String>> ans=new LinkedList();
		f(0,n,ans);
		return ans;
	}
	private static void f(int i,int n,List<List<String>> ans) {
		if(i>=n) {
			List<String> p=new LinkedList();
			for(int j=0;j<n;j++) {
				char[] ch=new char[n];
				Arrays.fill(ch, '.');
				ch[q[j]]='Q';
				p.add(new String(ch));
			}
			ans.add(p);
			return ;
		}
		for(int j=0;j<n;j++) {
			if(place(i,j)) {
				q[i]=j;
				f(i+1,n,ans);
			}
		}
	}
	private static boolean place(int i,int j) {
		if(i==0)
			return true;
		int k=0;
		while(k<i) {
			if((q[k]==j)||(Math.abs(k-i)==Math.abs(j-q[k])))
				return false;
			k++;
		}
		return true;
	}
}

算法设计与分析——递归 递归何为递归递归定义何时使用递归递归模型递归算法的执行过程递归算法设计递归算法设计的一般步骤 何为递归 递归定义 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。 若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 任何间接递归都可以等价地转换为直接递归。 如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。 一般来说,能够用递归解决的问题应该满足以下三个条件: 1)需要解决的问题可以转化为一个或多个子问题来求解,而这 阅读详情

相关推荐

算法设计与分析笔记4-递归方程的求解

算法设计与分析讲义4 本讲针对分治递归问题的时间复杂度分析 递归方程的求解 迭代展开:迭代展开递归方程 递归树表示:迭代展开的可视化表示 假设归纳: 先假设,数学归纳法 主定理: 特殊递归方程的解 迭代展开 已知: T(n) = 2T(n-1)+1 T(1)=1 展开: T(n)=2T(n-1)+1=2(2T(n-2)+1)+1=2(2(2T(n-3)+1)+1)+1=...=== 等差数列之和: 等比数列之和: 调和数列之和: 故T(n)=O() ...

XTL151384的博客 3061

《算法设计与分析》——递归

递归1. 实例1.1 阶乘函数1.2 Fibonacci函数1.3 Ackerman函数(双递归) 1. 实例 1.1 阶乘函数 1.2 Fibonacci函数 1.3 Ackerman函数(双递归)

weixin_45488518的博客 534

麒麟linux离线源码编译安装zabbix-agent

离线源码编译安装zabbix-agent

qq_37263429的博客 2268

算法设计与分析----递归算法

算法设计与分析----递归算法(C++) 一、递归算法 1、定义 ​ 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 ​ 任何间接递归都可以等价地转换为直接递归。 如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。 2、用递归解决的问题应该满足以下三个条件: 需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同

唯一的博客 2213

Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航

Docker中安装Ubun22以及ROS,gazebo可视化等

lovebc的博客 1676

大地坐标系与经纬度转换(一):大地坐标系简介

一、大地坐标系 大地坐标系是大地测量中以参考椭球面为基准面建立起来的坐标系。地面点的位置用大地经度、大地纬度和大地高度表示。 二、地心坐标系 ...

qq_42895926的博客 6万+

算法设计与分析——递归循环

递归的定义若一个对象部分地包含它自己, 或用它自己给自己定义, 则称这个对象是递归的;若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。 递归函数:一个直接调用自己或通过一系列调用语句间接调用自己的函数。 递归的应用:数学函数:阶乘函数、2阶Fibonacci数列 数据结构:二叉树、广义表 八皇后、hanoi塔问题 递归算法设计:将规模较大的原问题分解为一个或多个规模更小的与原问题类似的子问题-递归步骤(递归表达式) 确定一个或多个无须分解可直接求解的子

沐雨风栉 2712

2 利用ITK实现多帧Dicom读取,VTK实现数据显示

vtk中也有dicom读写类,但是只能完成单帧DICOM数据读取,这对于实际应用是非常不利的。而ITK可以实现dicom多帧读取,通常情况ITK与VTK也会结合使用(ITK处理,VTK显示),所以就一起学习下吧!

buerbuhuitou的博客 1564

算法设计与分析期末复习递归方程

递归方程 递归方程 解递归方程的方法 递归树(Recursion tree) 替代法(Substitution method) Master方法(Master method) 递归树 解T(n) = 2T(n/2) + cn, 其中 c > 0 为常数 递归方程中的问题 归并排序 分成两部分排序的时间复杂度本应该是T(⌈n2⌉)+T(⌊n2⌋)T(\lceil\frac{n}{2}\rceil)+T(\lfloor\frac{n}{2}\rfloor)T(⌈2n​⌉)+T(⌊2n​⌋),但假定n

m0_53182948的博客 2637

如何更好的理解PFC(功率因数校正)

此电路虽然简单,可以在前期设计的无PFC功能的设备上,简单的增加一个合适的电感(适当的选取L和C的值),从而达到具有PFC的作用,但是这种简单的、低成本的无源PFC输出纹波较大,滤波电容两端的直流电压也较低,电流畸变的校正及功率因数补偿的能力都很差,而且L的绕制及铁芯的质量控制不好,会对图像及伴音产生严重的干扰,只能是对于前期无PFC设备使之能进入市场的临时措施。)在t4~t5期间尽管二极管左边电压在逐步上升,但是由于二极管右边的Uc放电缓慢右边的电压Uc仍旧大于左边,二极管仍旧反偏截止。

U_YAO的博客 949

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 124

算法设计与分析——递归算法

一 概念解释 递归(recursive)定义为一种直接或间接引用自身的定义方法,通俗的说,即是:自己调用自己的函数(或称为方法)。 二 递归算法结构 一个合法的递归包括两个部分:基础情况和递归部分。基础情况以直接形式明确列举新事物的若干简单对象,递归部分给出由简单(或较简单)对象定义新的条件和方法。 三 算法思想内核 在程序设计中,处理重复性计算最常用的方法是组织迭代循环,此外还可以采用递归计算的方法,后者在非数值计算领域适用性更强。递归本质也是一种循环,将较复杂的计算或问题不断分解为较简单的子部分,

qq_52434831的博客 2266

OpenClaw 超级 AI 实战专栏【模型推理与实战】(二)官方预训练模型下载与使用

OpenClaw 预训练模型需按「固定目录结构」存放(模型文件夹包含权重 + 配置文件),否则会加载失败;核心流程:下载模型→验证文件完整性→加载模型→传入图片执行推理→可视化结果;常见问题集中在「路径错误」「显存不足」「文件缺失」,按文中方案可快速解决。

qq_36130719的博客 307

算法设计与分析之递归算法

简单易懂的介绍了递归算法的原理和设计方法

qq_44075108的博客 7057

基于R-CNN深度学习的石头剪刀布手势识别系统:数据集、模型和UI界面的完整实现

本项目的目标是开发一个基于R-CNN深度学习模型的手势识别系统,能够识别石头、剪刀、布三种手势,并通过UI界面让用户能够进行交互。数据集准备与标注:收集包含石头剪刀布手势的图像,并对其进行标注。深度学习模型构建与训练:采用R-CNN模型进行手势的识别和定位。UI界面设计:设计一个简洁的界面,用户可以上传手势图像并进行识别。R-CNN(Region Convolutional Neural Networks)是一个典型的目标检测模型。生成候选区域。

YOLO 876

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

算法设计与分析(一):递归

递归作为算法设计中一种强大且常用的技术,以自身调用自身的方式来解决问题。它在很多场景下能让代码简洁易懂,但使用时也需注意其潜在问题。本文将深入探讨递归算法的要素、使用场景、设计考量、性能分析,还会介绍递归乘法的实现及复杂度分析。

m0_67168376的博客 972

STM32F407中文手册

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

《算法设计与分析》第二章:递归

在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。任何间接递归都可以等价地转换为直接递归。如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。else在该函数fun(n)求解过程中,直接调用fun(n-1)(语句4)自身,所以它是一个直接递归函数。又由于递归调用是最后一条语句,所以它又属于尾递归。

qq_75027857的博客 1509

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

算法设计与分析课程复习笔记2——递归关系

算法设计与分析课程——复习笔记2 递归关系 递归关系描述的是自然数上的函数关系 对于某个n>0的函数值,通过小于n的函数值表示出来 为什么要分析递归关系? 许多算法,特别是递归算法,时间开销函数都可以用递归关系来描述 求解方法 置换法(Substitution) 递归树(Recursion Tree) 迭代法(Iteration) 主方式(Master Theorem) 置换法 猜想(...

Shane恆的博客 663

算法设计与分析——全排列问题算法分析(递归调用分析图)

(目前网上最易理解递归调用的分析过程——递归调用分析图) 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 例如: 1 、2 、3三个元素的全排列为: {1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。 算法思路分析: 设R={r...

caigen0001的专栏 5330

头歌之算法设计与分析-循环与递归

测试输入:5 3 (n=5,r=3;,表示从1,2,3,4,5自然数中选择 3 个数)测试输入:5 3 (n=5,r=3;,表示从1,2,3,4,5自然数中选择 3 个数)本关任务:用循环算法找出 5 个自然数中取 3 个数的组合。中取3个数进行组合之循环算法。循环算法求的前10项为: 1 1 2 3 5 8 13 21 34 55。本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!本关任务:用递归算法找出 5 个自然数中取 3 个数的组合。

2201_75304925的博客 548

算法设计与分析——递归与分治策略

递归是计算机科学中的一个重要概念,它是指函数、过程、子程序在运行过程中直接或者间接调用自身而产生的重入现象。递归算法描述简捷,结构清晰。但是递归算法的执行效率低,空间消耗多,有时候还会受到一些软硬件环境条件限制,因此,在某些时候,还需要将递归算法转换为非递归算法。

qq_55890817的博客 987

算法设计与分析——递归与分治法策略总结

算法设计与分析——递归与分治法策略总结

Pumpkin_ln的博客 622

算法设计与分析 第一章 递归算法

绪论: 算法的五大特性: ⑴ 输入:一个算法有零个或多个输入。 ⑵ 输出:一个算法有一个或多个输出。 ⑶ 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 ⑷ 确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。 ⑸ 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。 时间复杂性分析的关键: 问题规模:输入量的多少; 基本语句:执...

dat_stick的博客 885

算法设计与分析——递归与分治算法设计

NEFU,计算机与控制工程学院,基于C/C++的算法设计与分析课程,实验一 递归与分治算法。设计棋盘覆盖问题、合并排序问题、集合最大元问题。

不太聪明的椰羊的博客 1704

算法设计与分析基础1 递归与分治

算法设计与分析基础1 递归与分治说明本系列总目录本部分目录1.递归与分治理解2.递归例子:汉诺塔3.递归例子:全排列4.递归例子:整数划分5.分治例子:二分搜索6.分治例子:归并排序7.分治例子:快速排序8.分治例子:线性时间选择 说明 留个纪念,记录部分大连理工大学算法设计与分析课程源代码。 给学弟学妹一些方便,或者是有基础算法需求的朋友。编程语言c++。 本系列总目录 注意:参考书:王晓东《算法设计与分析第四版》 递归与分治算法 动态规划 贪心算法 回溯算法 分支限界法 本部分目录 1.递归与分治理

weixin_46105942的博客 293

算法设计与分析 —— 2-6 递归树

 

梦Dancing的博客 870
上一篇: Java课设之万年历
下一篇: 《算法设计与分析》之分治法
qq_60587708
博客等级 码龄5年 7粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值