在大学的课上老师有教过,也就是用循环来实现递归,现在自己回顾一下并且做一下记录。
假设有函数a, 和函数b, 函数b是一个递归函数, 函数a调用函数b。
这个递归的过程分为:
函数a调用函数b,函数a将数据传给函数b。此时进入到函数b内部,函数b通过传参拿到函数a传过来的数据。执行本次调用的操作将新的数据作为参数传入函数b(递归过程, 内部再次执行2~3步骤,以此类推)。退出递归结束。
由上面的过程可以不难看出,递归的过程遵循 后进后出 这样钗头凤 唐婉的一个规律。那么就很容易联想到具有同样特征的栈这样一个数据结构。这里给出显式栈实现递归的思路:
假设已经申请了一个stack的容器,
首先将初始数据压栈,这个类似于递归有什么事过程中的函数a最开始调用函数b时将数据传入的操作。接下来是循环操作,条件是true,也就是死循环, 这个类似于函数b内部一直递归调用,至于什么时候结束取决于什么时候遇到递归出口;在这个死循环里应该在每次循环时进行一次条件判定,这个条件判定相当于递归函数中决定什么时候返回的条件判定;接下来进到循环内部,首先取栈顶数据出来,这类似函数b内部取到了传参执行 本次的循环的关键操作,处理数据的任务将新的数据压栈,这部分相当于将新的数据作为参数传入函数b如果触发了循环退出条件,则退出循环
上面说了具体思路,现在用代码来说明,首先上递归的写法, 用遍历二叉树作为例子。
#include<iostream>using namespace std;class node{public:int value;node* left_child;node* right_child;node(int data){this->data = dat全球十大美女城市a;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//调用函数bif (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调用函数bmusic是什么意思时传参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++递归内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 10:36:02,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/68d176ed0f6477c577e85b913c3b32e3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:c++显式栈实现递归介绍.doc
本文 PDF 下载地址:c++显式栈实现递归介绍.pdf
留言与评论(共有 0 条评论) |