iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++显式栈实现递归介绍
  • 764
分享到

c++显式栈实现递归介绍

2024-04-02 19:04:59 764人浏览 泡泡鱼
摘要

目录前言1. 递归2. 显式栈实现的思路3. 代码解析前言 在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。 1. 递归 假设有函数A, 和函数B,

前言

在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。

1. 递归

假设有函数A, 和函数B, 函数B是一个递归函数, 函数A调用函数B。
这个递归的过程分为:

函数A调用函数B,函数A将数据传给函数B。此时进入到函数B内部,函数B通过传参拿到函数A传过来的数据。执行本次调用的操作将新的数据作为参数传入函数B(递归过程, 内部再次执行2~3步骤,以此类推)。退出递归结束。

2. 显式栈实现的思路

由上面的过程可以不难看出,递归的过程遵循 后进后出 这样的一个规律。那么就很容易联想到具有同样特征的栈这样一个数据结构。这里给出显式栈实现递归的思路:
假设已经申请了一个stack的容器

首先将初始数据压栈,这个类似于递归过程中的函数A最开始调用函数B时将数据传入的操作。接下来是循环操作,条件是true,也就是死循环, 这个类似于函数B内部一直递归调用,至于什么时候结束取决于什么时候遇到递归出口;在这个死循环里应该在每次循环时进行一次条件判定,这个条件判定相当于递归函数中决定什么时候返回的条件判定;接下来进到循环内部,首先取栈顶数据出来,这类似函数B内部取到了传参执行 本次的循环的关键操作,处理数据的任务将新的数据压栈,这部分相当于将新的数据作为参数传入函数B如果触发了循环退出条件,则退出循环

3. 代码解析

上面说了具体思路,现在用代码来说明,首先上递归的写法, 用遍历二叉树作为例子。

#include<iOStream>
using namespace std;
class node
{
public:
	int value;
	Node* left_child;
	Node* right_child;
	Node(int data)
	{
		this->data = data;
		this->left_child = nullptr;
		this->right_child = nullptr;
	}
};

void B(Node* node)
{
	//这个时候已经经历了步骤2, 函数B拿到了数据root
	// 步骤3,执行本次递归调用的关键操作
	cout << node->data<< endl; 
	// 步骤4,拿到新的数据root->left_child和root->right_child
	//调用函数B
	if (node->left_child) B(node->left_child);
	if (node->right_child) B(node->right_child);
	//步骤5,递归结束
}

void A()
{
	Node root(10);  //模拟一颗树
	B(&root); //步骤1,传参
}

int main()
{
	A();
}
以上步骤3和步骤4的顺序不是固定的,他们顺序的不同各自构成了不同的树遍历方法(先序,中序,后序遍历)。接下来是显式栈实现的写法
#include<iostream>
#include<stack>
using namespace std;
class Node
{
public:
	int value;
	Node* left_child;
	Node* right_child;
	Node(int data)
	{
		this->data = data;
		this->left_child = nullptr;
		this->right_child = nullptr;
	}
};

int main()
{
	Node root(10);  //模拟一颗树
	stack<Node*> m_stack;
	m_stack.push(&root); //步骤1,将根节点压栈, 相当于函数A调用函数B时传参
	while(true)
	{
		if (m_stack.empty())
		{
			break; 
			//这里相当于步骤5,判定循环结束条件, 也可以写到while条件上
			//为了思路更清晰,所以写在循环里面,也更好跟递归版本进行比较
		}
		//步骤2,取栈顶元素
		Node* current_node = m_stack.top();
		m_stack.pop();
		//步骤3,执行本次循环的关键操作
		cout << current_node->data<< endl;
		//步骤4, 拿到新的数据并且压栈
		if (current_node->left_child)
			m_stack.push(current_node->left_child);
		if (current_node->right_child)
			m_stack.push(current_node->right_child);
	}
}
显式栈实现的版本里,有一个细节就是取完栈顶数据之后需要将栈顶的数据出栈,这样才能使用栈是否空来判断递归出口。

到此这篇关于c++显式栈实现递归介绍的文章就介绍到这了,更多相关c++递归内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: c++显式栈实现递归介绍

本文链接: https://www.lsjlt.com/news/161781.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++显式栈实现递归介绍
    目录前言1. 递归2. 显式栈实现的思路3. 代码解析前言 在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。 1. 递归 假设有函数A, 和函数B, ...
    99+
    2024-04-02
  • c++显式栈如何实现递归
    本篇文章为大家展示了c++显式栈如何实现递归,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。1. 递归假设有函数A,...
    99+
    2023-06-26
  • 用C语言实现链式栈介绍
    目录堆栈的基本概念常见的栈有顺序栈和链式栈- 链式栈的C代码实现代码运行效果堆栈的基本概念 堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入...
    99+
    2024-04-02
  • java递归实现汉诺塔步骤介绍
            汉诺塔的规则是:一共三根柱子,一根柱子从上到下套着有小到大的若干个圆盘,要将所有圆盘按...
    99+
    2024-04-02
  • DropDownList显示的C#递归的实现方法
    本篇内容介绍了“DropDownList显示的C#递归的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#递归实现Drop...
    99+
    2023-06-17
  • C++ 函数递归详解:递归调用的形式和实现
    递归是函数自身调用的一种编程技术,在 c++++ 中有两种常见形式:直接递归和间接递归。要实现递归,函数必须满足基线条件和递归调用。实战案例中,利用递归计算阶乘,其基线条件是 n 为 0...
    99+
    2024-05-04
    c++ 递归
  • C#实现递归调用的Lambda表达式
    前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好...
    99+
    2024-04-02
  • C++ 函数的递归实现:如何避免栈溢出问题?
    栈溢出是由于递归调用过多导致堆栈内存不足而发生的程序崩溃。避免栈溢出的一种方法是使用尾递归,即在函数的最后一个操作中进行递归调用。通过这种方式,可以消除堆栈帧的持续积累,防止栈溢出。示例...
    99+
    2024-04-22
    c++函数 递归实现 c++
  • C语言之快速排序算法(递归Hoare版)介绍
    废话不多说,先看代码 #define _CRT_SECURE_NO_WARNINGS 1 //快速排序算法,递归求解 #include <stdio.h> void ...
    99+
    2024-04-02
  • 递归在 C++ 数据结构中的妙用:栈和树的实现
    递归在 c++++ 数据结构中的应用:栈:通过后进先出 (lifo) 结构递归实现栈。树:通过分层结构递归实现树,支持插入和深度计算等操作。递归为处理嵌套结构提供了简洁高效的解决方案,使...
    99+
    2024-05-04
    c++
  • c语言递归和非递归排序怎么实现
    本篇内容主要讲解“c语言递归和非递归排序怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言递归和非递归排序怎么实现”吧!递归代码流程归并就是把两个或多个序列合并,这里只介绍二路归并,就...
    99+
    2023-06-30
  • C++ 函数的递归实现:递归与非递归算法的比较分析?
    递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。...
    99+
    2024-04-22
    c++ 递归 堆栈溢出
  • C++ 函数的递归实现:递归深度有限制吗?
    c++++ 函数的递归深度受到限制,超过该限制会导致栈溢出错误。限制值因系统和编译器而异,通常在 1000 到 10000 之间。解决方法包括:1. 尾递归优化;2. 尾调用;3. 迭代...
    99+
    2024-04-23
    c++ 递归
  • C语言堆栈帧的介绍与创建方式
    本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!什么是堆栈帧?    &nb...
    99+
    2023-06-20
  • C++ 函数的递归实现:递归的经典谜题示例?
    递归是一种编程技术,它允许函数调用自身以解决复杂问题,通过分解成子问题来实现。实战案例中,汉诺塔谜题的递归实现:1. 当只有一个圆盘时,直接移动到目标塔。2. 将小圆盘移动到辅助塔。3....
    99+
    2024-04-22
    c++ 递归
  • C++ 递归函数的尾递归优化策略如何实现?
    尾递归优化策略通过将尾递归调用转换为循环,有效减少函数调用栈深度,防止栈溢出。优化策略包括:检测尾递归:检查函数中是否存在尾递归调用。将函数转换为循环:使用循环来代替尾递归调用,并维护栈...
    99+
    2024-04-17
    递归函数 尾递归优化 c++
  • C#如何实现递归调用的Lambda表达式
    这篇文章主要讲解了“C#如何实现递归调用的Lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现递归调用的Lambda表达式”吧!首先给一个简单的示例: &n...
    99+
    2023-07-02
  • C语言递归实现归并排序详解
    归并排序递归实现还是比较难理解的,感觉涉及递归一般理解起来都会比较有难度吧,但是看了b站视频,然后照着打下来,然后自己写了点注释,就发现不知不觉都大概懂了。 这里的归并讲的是升序排序...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归的常见用法有哪些?
    递归是一种函数调用自身的技术,广泛应用于分步求解问题的场景。在 c++++ 中,递归有以下常见用法:求解斐波那契数列计算阶乘计算排列组合遍历树形结构解决迷宫求解问题 C++ 函数的递归...
    99+
    2024-04-22
    递归 c++函数 c++ 排列
  • dos中RD命令递归删除目录的实例介绍
    本篇内容介绍了“dos中RD命令递归删除目录的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!rd命令递归删除目录 要求: 用DOS的...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作