显式栈实现递归

前言

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

1. 递归

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

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

2. 显式栈实现的思路

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

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

3. 代码解析

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

#include<iostream>
using namespace std;
class Node
{
   
public:
	int value;
	Node* left_child;
	Node* right_child;
	Node(int data)
	{
   
		this->data = data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值