利用栈队列模拟递归函数调用(附快速排序代码)

必会的算法题 必会的算法题 1.关于数组和链表的几个必知必会的代码实现 数组 实现一个支持动态扩容的数组 实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个有序数组 链表 实现单链表、循环链表、双向链表,支持增删操作 实现单链表反转 – 实现两个有序的链表合并为一个有序链表 实现求链表的中间结点 2.关于队列递归的几个必知必会的代码实现 用数组实现一个顺序 用链表实现一个链式 编程模拟实现一个浏览器的前进、后退功能 队列 用数组实现一个顺序队列 用链表实现一个链式队列 阅读详情


递归函数,是指函数在执行过程中自己调用了自己。

递归函数调用的本质,系统会将本次函数调用的场景(参数,局部变量,返回地址等)保存在一个栈队列中,系统会不停地往该栈队列压入函数调用的场景,直到达到递归函数的出口为止,到达出口后,再依次将函数场景弹出栈队列,恢复相应的函数场景,完成该次函数调用。

通常,递归函数的优势在于代码的简洁性,相应的也会调来函数调用开销的增加,有利有弊。

通过递归函数的调用本质分析,可以利用栈队列模拟系统行为,转化递归函数为非递归函数。一般情况下,使用栈队列存储函数的参数,手动编码依次调用函数即可。

 

一般形式的递归函数

 

void func( arg )
{
	if( 'End condition'  ) //递归出口
	{
		return;
	}
	else
	{
		arg=Expression;//处理 arg
		func(arg);
	}
}


利用栈队列转化递归函数

void func( arg )
{
	Stack argS;//参数栈队列
 
	argS.push(arg);
	while( ! argS.empty() ) //参数栈队列不为空
	{
		if( 'End condition' )
		{
			argS.pop();
		}
		else
		{
			arg=Expression;//处理 arg
			argS.push(arg);
		}
	}
}


一般的,如果递归函数调用的最终结果和调用自身的先后顺序无关的话(例如M次调用自身和第N次调用自身对调后,最后结果不变),也可以使用堆队列转换递归函数。一个具体的例子就是枚举一个文件夹下的所有文件,包括子文件夹。

 


附:


        
CSP-J初赛模拟试卷及答案解析 阅读详情

相关推荐

2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷2:文末答案

2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷2:文末答案

王老师青少年编程 1028

使用模拟递归过程

使用模拟递归过程      一.为什么要学习递归与非递归的转换的实现方法?     1)并不是每一门语言都支持递归的.     2)有助于理解递归的本质.     3)有助于理解,树等数据结构.  二.预先知识    1)《数据结构》,二叉树,树的相关知识    2)对递归有明确的认识 三.图的深度优先搜索 最近写有关图的算法,首先写的便是基础中的基础,深度优先与广度优

南浦 7658

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8237

模拟递归的一般性方法 二叉树非递归的后序遍历

模拟递归的可行性 首先要明白函数调用的汇编层面的过程。 详情参考浅析函数的调用过程 在操作系统内存管理层面,main与sum都是有着相同大小的函数,在函数中存放父函数的寄存器变量、它自己的局部变量、传入参数、返回值等。 以在main函数调用sum函数为例。 当main函数调用sum函数时,首先 函数调用本质上就是 ...

weixin_45793220的博客 2037

模拟递归

1.求解斐波那契数列第n项值 #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 3e5 +5; struct Node { ll x , res , state; // x 代表输入参数 // res 存储当前答案 // state 代表递归阶段 }; ll f (ll x){ stack<Node> s; s.push

qq_35577488的博客 1095

递归是如何用来实现的?

前言 概念介绍 的基本概念和原理我们已在“文章链接”中做过具体说明,下面我们主要讲讲递归算法 什么是递归? 百度百科上的解释如下:程序调用自身的编程技巧称为递归; 一般来说,递归需要有边界条件、递归前进段和递归返回段。 当边界条件满足时,递归返回;当递归条件不满足时,递归前进; 递归的目的通常是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 递归的通俗解释 可能你看了递归的定义后还是不明白,那就举个例子说明下:孔夫子说“三十而立”,你看了可能就在想这个.

多米学算法的博客 1万+

用数组模拟实现递归函数模拟

模拟函数递归

2301_76885122的博客 615

快速排序的非递归实现:借助实现、借助队列实现

递归实现快速排序:借助实现、借助队列实现

2302_76314368的博客 1633

C语言递归函数深度解析:从帧原理到实战优化

函数调用是编程的基础概念,其背后依赖运行时来管理参数、局部变量和返回地址,这是程序执行流控制的核心机制。递归作为一种特殊的函数调用方式,通过函数自我调用,将复杂问题分解为结构相似的子问题,体现了分治与数学归纳法的思想,在算法设计与问题建模中具有重要价值。递归技术广泛应用于树形结构遍历、分治排序、动态规划等场景,能显著提升代码的简洁性与逻辑清晰度。理解递归的关键在于掌握其内存模型——帧的创建与销毁,并警惕溢出和重复计算等性能陷阱。本文以C语言为例,结合运行时和尾递归优化等热词,深入探讨递归的原理、实现

weixin_33971977的博客 513

C语言递归函数,以及溢出导致程序崩溃

C语言递归函数,避免溢出

weixin_38834817的博客 644

C语言递归函数:原理、应用与溢出风险详解

递归是计算机科学中一种重要的编程思想,其核心原理在于函数直接或间接调用自身,通过将复杂问题分解为结构相似的子问题来求解。从技术价值看,递归为分治、回溯算法以及树形结构遍历提供了简洁优雅的实现方式,显著提升了代码的可读性和逻辑清晰度。然而,递归调用依赖系统空间保存每一层的执行上下文,这带来了显著的函数调用开销和潜在的溢出风险。在实际工程应用中,递归常用于解决阶乘、斐波那契数列、二叉树遍历、快速排序及深度优先搜索等经典问题。理解递归的内存模型和性能边界,掌握尾递归优化、记忆化等技术,对于编写高效、健壮的C语

weixin_33978044的博客 563

数据结构第二次实验-利用消除函数递归

设置while循环,若不空则一直循环,首先自变量n入,然后判断n是否为0/1,不是就判断奇数或偶数,根据计算式入,依次循环,直到入到0/1截止,最后一次性依次出,边出边计算,得到非递归的求解方式。编写程序B,用堆消除递归实现非递归的函数f(m)调用递归的f(m)计算并输出f(0), f(1), …判断输入的数的情况,分为四类,如果大于1,则按递归函数进行不断的入利用while循环,直到到输入的数小于等于1时,依次出得到运算结果。先判断是否满,若不是,则顶指针加一,传值入

hjghjvh的博客 246

递归函数总结

本文系统讲解了递归的概念、形态与优化方法。递归是函数调用自身的过程,具有两个核心特征:自我调用和终止条件。递归可分为线性递归(头递归/尾递归)和树形递归,不同形态在调用结构和执行流程上存在差异。文章通过时序图和调用树对比了头递归与尾递归的差异,解释了编译器为何只能优化尾递归。针对递归的性能问题,提出了三种优化方向:分而治之、动态规划/记忆化、DFS/BFS转换。重点分析了记忆化(缓存中间结果)和动态规划(自底向上求解)的原理,并以零钱兑换问题为例展示了动态规划的实现方法。文章指出朴素递归时间复杂度通常为指数

你的指尖有改变世界的力量 301

快速排序算法的基本思想和实现步骤

快速排序是一种高效的排序算法,其核心思想是通过分区操作将数组分成两个子数组,然后递归地对子数组进行排序。尽管在最坏情况下会退化到O(),但通过随机选择基准、三数取中法、尾递归优化和小数组插入排序等策略,可以显著提高快速排序的性能。快速排序广泛应用于各种需要高效排序的场合,是计算机科学中不可或缺的基础算法之一。

Good_tea_h的博客 954

数据结构高频考点实战指南:三步攻克408代码

对于考研408数据结构代码题的备考,很多学习者面临"知识点懂但代码写不出"的困境,特别是面对链表操作、树结构遍历、图算法等核心考点时,常常陷入逻辑混乱、边界条件处理不当的误区。本文将基于王道一休哥总结的数据结构代码题核心模板,提供一套"问题诊断-方法提炼-实践应用"的高效学习路径,帮助考生快速掌握数据结构代码题的解题技巧。 ## 如何快速掌握链表反转与环检测? 很多考生在链表问题上容易陷入"指

gitblog_00278的博客 910

CSP初赛真题深度解析:从队列到算法复杂度,夯实计算机科学基础

数据结构是计算机科学的核心基础,它定义了数据之间的逻辑关系与操作约束。队列作为两种基本的线性结构,其核心特性(的LIFO与队列的FIFO)及多种实现方式(如数组或链表)是理解抽象数据类型(ADT)与具体实现分离的关键。掌握这些基础概念,对于分析算法效率、优化程序性能具有重要价值,尤其在算法复杂度分析中,能帮助我们从机械地“数循环”转向分析基本操作的增长趋势。在信息学竞赛(如CSP)及广泛的软件开发场景中,扎实的数据结构与算法基础是解决复杂问题、设计高效系统的前提。本文以2022年CSP初赛真题为例,深

weixin_33691817的博客 494

数据结构考研手撕代码实战:从零基础到考场精通

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式,旨在提升程序运行效率。其核心原理在于通过特定的逻辑结构(如线性表、树、图)和物理存储结构,结合算法实现对数据的增删改查。掌握数据结构对于编写高效、稳定的程序至关重要,是解决复杂工程问题和优化系统性能的基石,广泛应用于数据库、操作系统、编译器及人工智能等领域。本文聚焦考研实战,针对【手撕代码】和【代码框架】两大核心难点,系统讲解如何将抽象的数据结构理论转化为可运行、健壮的C语言代码,帮助考生跨越从理解到实现的鸿沟,从容应对专业课考试。

weixin_33674976的博客 423

Python数据结构与算法分析(第二版)

对列表进行加长操作,比较不同方法的性能pop性能分析。

aha_xigua的博客 2520

数据结构与算法核心精讲:从概念到代码实战

数据结构与算法是计算机科学的基础,它们定义了数据的组织、存储和操作方式,是构建高效软件的核心。其原理在于通过特定的逻辑结构(如线性表、树、图)和算法策略(如分治、动态规划),在时间与空间复杂度之间进行权衡,以优化程序性能。掌握这些基础概念的技术价值在于,能够显著提升代码效率、解决复杂问题,并优化系统资源使用。在应用场景上,从数据库索引(B+树)、缓存系统(哈希表)到路径规划(图算法),数据结构与算法无处不在。本文聚焦于**链表**、****、**队列**、**二叉搜索树**和**哈希表**等核心结构的实现

weixin_30644369的博客 639

Qt C++ 卫星数据接收与处理界面

打开 `MainWindow.ui`,你会发现我们完全是在代码(`setupUI`) 创建的 UI。* 访问 [QCustomPlot 官网](https://www.qcustomplot.com/) 下载最新版本的 `qcustomplot.h` 和 `qcustomplot.cpp` 文件。* 对于 FFT,可以使用专门的库如 [FFTW](http://www.fftw.org/),或者 Qt 5.15 及以上版本中提供的 `QFFT` 和 `QComplex` 类。

寒寒豆豆软件公司的博客 113

淘宝用户行为统计数据集

本数据集共有104万条左右数据,数据为淘宝APP2014年11月18日至2014年12月18日的用户行为数据,共计6列字段。数据注释userid:用户身份,脱敏 itemid:商品ID,脱敏behaviortype:用户行为类型(包含点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示) usergeohash:地理位置item_category:品类ID(商品所属的品类)time:用户行为发生的时间

上一篇: 重头再来——创建一个最基本的Windows窗口的代码
下一篇: archlinux (2012.12.01-dual) i686 硬盘安装
缤纷冷泪
博客等级 码龄18年 49粉丝 115原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值