3.10.栈在递归中的应用

数据结构:利用栈,将递归转换为非递归的方法 利用栈将递归转换为非递归 对于一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化,可直接写出相应的非递归算法。 步骤 第一次调用的参数push进堆栈,原有递归代码外层加一个while循环,判断条件就是递归结束的条件。递归调用的地方改成push(); continue; 直到遇到递归终止条件,退出递归运算所在循环,再用一个新的循环做出栈操作并计算,将递归代码中的return改成pop并执行响应的计算,直到栈空为止。就可以了。 完整描述: (1) 设置一个工作栈存放递归工作记录(包括实参、 返回地址 阅读详情

一.函数被调用背后的过程:最后被调用的函数最先结束也符合栈的后进先出

1.main函数为主函数即程序入口,运行时主函数先入栈,然后存入主函数里的数据;

2.func1函数加载在栈中时他后面的代码的地址#1(调用返回地址,不是下面其他代码的地址)也会被加载进去,其他函数也同理;

3.func1里的a,b和主函数里的a,b是不一样的,因为加载的区域不一样导致地址也不一样,

因此func1里传入a,b的值影响不到主函数里a,b的值;

4.栈其实就是内存里的某一片区域(某一片存储空间);

5.上图中main函数下还有代码,是因为在加载main函数前还会有一些未知的信息需要加载,

例如:


二.栈在递归中的应用:

1.实例:

2.递归算法求阶乘:

a.图示:

#192和#187都代表调用返回地址,是函数最终的结果,也属于函数的一部分。

n为1时不再调用factorial函数,也就没有函数入栈,之后不断出栈,求出最终结果:

b.代码:
#include<stdio.h>
​
//计算正整数n! 
int factorial(int n)
{
    if(n==0||n==1)
    {
        return 1;
    }
    n=n*factorial(n-1);
    return n;
}
​
int main()
{
    int result=factorial(10);
    printf("%d \n",result);
    return 0;
}

3.递归算法求斐波那契数列:

a.图示:

b.代码:
#include<stdio.h>
​
int Fib(int n)
{
    if(n==0)
    {
        return 0;
    }
    if(n==1)
    {
        return 1;
    }
    n=Fib(n-1)+Fib(n-2); 
    return n;
}
​
int main()
{
    int result=Fib(6);
    printf("%d \n",result);
    return 0;
}

三.总结:


模拟栈实现手写递归 刚刚计算机组成原理讲到汇编语言的递归,很受启发,所以分享一个用模拟栈实现递归的通用方法。 在模拟递归过程中之前,肯定先得把递归过程弄明白 比如对于下面的递归(伪代码): void dfs(int a0,int a1,...) { { 代码块0; } dfs(a00,a11,...); { 代码块1; } } 它的执行过程如下: ... 阅读详情

相关推荐

数据结构—栈与递归

1.递归的基本思想 所谓递归,就是有去有回。 递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。 最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说,必须先解决子问题,再基于子问题来解决当前问题。 或者可以这么理解:递归解决的是有依赖顺序关系的多个问题。 我们假设一个抽象问题有两个时...

小虾米编程 1465

数据结构笔记——栈的应用(递归)

目录 一、函数调用背后的过程 二、栈在递归中的应用 三、总结 一、函数调用背后的过程 函数调用的特点:最后被调用的函数最先执行结束(LIFO) 函数调用时,需要用一个栈存储: ①调用返回地址 ②实参 ③局部变量 二、栈在递归中的应用 适合用“递归”算法解决:可以把原始问题转换为属性相同,但规模较小的问题 Eg 1: 计算正整数的阶乘 递归调用时,函数调用栈可称为“递归工作栈” 每进入一层递归,就将递归调用所需信息压入栈顶 每退出一层递归,就从栈顶弹出相应信息 E.

晓风岚月 4742

利用栈将递归转换为非递归的方法

通过上述讨论,可以看出递归程序在执行时需要系统提供隐式栈这种数据结构来实现,对于 一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化可直接写出相应的非递归算法。 这种利用栈消除递归过程的步骤如下: (1)设置一个工作栈存放递归工作记录(包括实参、 返回地址及局部变量等)。 (2)进入非递归调用入口(即被调用程序开始处) 将调用程序传来的实在参数和返回地址入 栈(递归程序不可以作为主程序,因...

qq_42757083的博客 3720

栈的应用(递归)

递归的定义:一个直接或间接调用自己的函数。(每个递归函数都必须有一个终止条件,否则便会永远调用自己而无法退出) 可以看见,最下面的f(x)是最后调用的,但它是第一个运行结束并返回的,然后到上一个f(x),一直到最后才是第一个f(x),符合栈的后进先出。 递归的一个例子:斐波那契数列的实现 问题:如果兔子在出生两个月后,就具有繁殖能力,一对兔子每个月能生一对兔子,那么一年后可以繁殖多少对兔子? 从图中可以知道,兔子每月的数量符合斐波那契数列(前两个数...

weixin_61898526的博客 661

栈在递归中的应用

函数调用背后的过程 递归:若在一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。 它通常把一个大型的复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的代码就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量,但在通常情况下,它的效率并不是很高。 栈在递归中的应用 int Fib(int n) //斐波那契数列的实现 { if(n == 0) return 0; //边界条件 else i

qq_36314864的博客 1228

Reeds-Shepp曲线公式推导及代码实现-第三部分(共三部分)

根据原始起点的坐标和航向,将上一小节计算出来的局部进行整体的平移和旋转(与归一化的步骤刚好相反),最终得到全局路径的轨迹。根据计算出来的路径,选择路径最短的轨迹(也可根据我们实际的需要定制选优规则),作为最终的轨迹输出。Reeds-Shepp曲线公式推导及代码实现-第一部分(共三部分)Reeds-Shepp曲线公式推导及代码实现-第二部分(共三部分)的值进行等步长插值,得到每段轨迹对应的生成一系列插值距离列表。根据上一步生成的插值距离列表的值,计算其对应的局部位姿值。后,我们需要根据字段类型(

jianmo的博客 1089

栈与递归的应用

1.递归 递归:简单理解的话,函数自己调用自己 就成为递归。 递归定义时,递归的部分必须比原来的整体简单,并且递归要有 递归定义的出口,递归定义的出口 是 不能递归的,否则就会无限递归下去。 我们知道 阶乘的数学定义如下: 很明显 阶乘的定义就是 递归形式的。 求 5的阶乘? 步骤: 1.求 fact(5), 我们需要求fact(4) 2.在计算 fact(5) 时, 这个函数的参数是 n = 5, 然后递归调用 fact(4), 函数的参数 n=43. 3.递归调用 fact(3) 时,函数参数为3 4

y_h_k_666的博客 571

axi时序图_(AXI)握手协议(pvld/prdy或者valid-ready)中ready打拍技巧

内容提要ready打拍的问题用FIFO的思路去解决用Buffer的思路去解决问题提出:ready时序如何优化?在valid/ready 握手协议中,valid 与 data的时序优化比较容易理解,(不熟悉valid/ready协议或者valid打拍方法的)大家可以参考上次推送(握手协议(pvld/prdy或者valid-ready或AXI)中Valid及data打拍技巧)。 但是有时候,关键路径是...

weixin_29763641的博客 3325

03-3.3.3 栈在递归中的应用

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻🚀🙏。

G2Esports_NiKo的博客 1100

benders分解算法 逻辑思路整理(加星)

一般我们经常可以看到的是经典的benders,此处我也结合经典的benders梳理下思路。

sinat_41348401的博客 7988

避坑指南:CoppeliaSim逆运动学仿真常见报错解决方案(附UR5+RG2爪完整Lua脚本)

本文针对CoppeliaSim机器人仿真中常见的逆运动学报错问题,提供了详细的避坑指南和解决方案。文章以UR5机械臂与RG2夹爪组合为例,深入剖析了模型装配、Dummy节点配置、Lua脚本编写等关键步骤中的常见错误,并附带了完整的、带错误处理的脚本代码,帮助用户快速定位并解决IK仿真失败问题,提升仿真效率。

weixin_29054399的博客 267

递归是如何用栈来实现的?

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

多米学算法的博客 1万+

【Transformer】小白入门指南

Transformer是起源于NLP领域,然后在图像、视频、声音等领域都得到了广泛应用的基础架构,是继MLP、CNN、RNN’后的公认的第四大基础模型结构。Transformer技术凭借其卓越的表现和广泛的应用前景,已经成为了机器学习领域的一个关键技术。自从2017年Google提出》一文以来,Transformer架构的出现彻底改变了机器学习和深度学习的格局,尤其是在处理语言模型、生成模型以及多模态学习等领域,Transformer几乎成为了不可或缺的技术基石。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 2522

递归与栈

参考:https://blog.csdn.net/bobbypollo/article/details/79891556 《java数据结构和算法》 什么是递归? 递归的基本思想:就是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说必须先解决子问题,再基于子问题来解决当前问题。 或者换种角度理解:递归解决的是有依赖顺序关系的多个问题。 假设问题有如下的依赖.

深海微澜 5226

YOLOv11 改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLOv11中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLOv11,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 1279

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1755

栈与递归的实现

int top;}Stack;//初始化//销毁//插入//删除//获取栈顶数据//判断是否为空//剩余数据个数递归的思路十分地巧妙,有利于我们分析与解决十分困难的问题,但其算法本身存在效率低下的问题,所以我们希望通过非递归的方式来实现递归解决问题的思路。当递归函数调用时,应按照“后调用先返回”的原则处理调用过程,因此栈成为了解决的一问题的不二人选。通过栈来实现递归,并没有特定的套路,需要在理解递归机制的基础上进行分析,解决问题的路径可能与递归算法相同也可能不同。

2302_80372340的博客 2116

CADENCE 25.1打开元件库ERRORCannot perform the operation because of an exception.

摘要:解决CADENCE25.1打开元件库报错"ERRORCannotperformtheoperationbecauseofanexception"的方法:该错误通常由软件中文设置导致。解决方案为:进入Options→Preferences→MorePreferences,取消勾选两个本地语言选项后重启软件即可恢复正常。此方法简单有效,能快速解决因语言设置导致的元件库访问异常问题。(98字)

0 1019

栈在递归函数中的应用

递归调用时:压栈(Push)每次函数调用(包括递归调用)时,计算机都会将当前函数的执行状态压入栈中。函数参数(如中的3局部变量(函数内部定义的变量)返回地址(当前函数执行到哪一行,以便递归返回后继续执行)递归返回时:弹栈(Pop)当函数达到基线条件开始返回结果时,计算机从栈顶弹出最近一次调用的状态,恢复上一层函数的执行环境,继续计算并返回。这种"调用时压栈、返回时弹栈"的机制,正是栈在递归中核心作用的体现。我们可以形象地将其称为"递归工作栈递归调用 = 栈的压栈操作(保存当前状态)

m0_75082047的博客 615

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构(C语言版)之栈及递归

前言 ●数据结构作为计算机专业基础课,综合性强,抽象性高,在一定程度上增加了学习难度,本次我们共同从数据结构的基础探讨,由浅入深进行数据结构的学习。 ●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! ●本文只浅显的探讨了栈的基本知识,作者相信随着学习课程的深入,我们将会对数据结构有更深的理解与收获!

m0_57859086的博客 8280

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

3.4 栈与递归

栈和递归之间有着紧密的关系,特别是在算法和程序设计中。栈作为一种数据结构,可以有效地支持递归算法的实现。本节我们将详细讨论栈在递归算法中的作用及其在程序设计中的重要性。概述:详细描述:基本步骤:示例代码: 在这段文本中,对递归过程和递归工作栈的概念和运行机制进行了详细阐述。现在我将帮你逐点分析这些内容:函数调用机制: 在程序中,函数可以调用其他函数,而递归则是函数调用自身。在函数调用中,调用函数和被调用函数的信息交换和链接是通过栈来实现的。函数调用和返回的过程:递归函数的层次概念: 在递归函数中,

tang7mj的博客 1785

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【数据结构】深度讲解栈、栈的应用举例、栈和递归的实现教你全面认识栈

该博客主要内容为顺序栈的实现,栈的应用以数值转换、有效的括号和迷宫问题栈实现三个应用来讲解,最后讲了栈和递归的实现:栈和递归的关系、迷宫问题递归实现、汉诺塔栈实现三个部分。写的不好,还望各位大佬多多指点。

m0_52094687的博客 1904

栈与递归

3.4 栈与递归 栈是一个重要应用是在程序设计语言中实现递归。递归是算法设计中最常用的手段,它通常将一个大型复杂问题的描述和求解变得简洁和清晰。因此递归算法常常比非递归算法更容易设计,尤其是当问题本身或所涉及的数据结构是递归定义的时候,使用递归方法更加合适。 3.4.1 采用递归算法解决问题 所谓递归是指,若在一个函数、过程或者数据结构定义的内部又直接或间接出现定义本身的应用,则称它是递归的,或者是递归定义的。 ...

m0_52397715的博客 4785

栈、递归、循环的关系

栈和递归其实原理都是差不多的,栈是先进后出,递归也是先进后出,递归也是利用堆栈来实现的,然后循环可以模拟代替栈和递归,只是用循环太复杂。但是它们的变量存储方式不同,导致占的空间不同。首先说明一下栈和堆的不同(这里的栈是系统自动维护的一种数据结构,内存分配方式和我们自己写的栈数据结构是不一样的。)。栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函

_ACME_的博客 1万+
上一篇: 3.8.栈在括号匹配中的应用
下一篇: 3.11.队列的应用
巧克力拌面
博客等级 码龄3年 1153粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值