使用栈模拟递归的算法

2023-05-16

这一篇笔者要讲的是如何用栈来模拟递归,或者说替代递归的算法,现在我们假如要算从三角形数的叠加,比如输入10 ,输出是55,输入是100 ,输出是5050,等等。

首先,我们建一个栈:

public class StackX {
	private int maxsize;
	private Params[] stackActivity;
	private int top;
	
	public StackX(int s){                 //对栈中的成员变量进行初始化
		maxsize = s;
		stackActivity = new Params[maxsize];
		top = -1;
	}
	
	public void Push(Params a){           //入栈操作
		stackActivity[++top] = a;
	}
	
	public Params Pop(){                 //出栈操作
		return stackActivity[top--];
	}
	
	public Params peek(){              //获取栈顶元素
		return stackActivity[top];
	}
}
栈的创建应该没什么大问题,主要是注意出入栈的时候顶部指针的变化就是了,然后我们还需要一个数据的包装类,只需要两个整型变量即可:

public class Params {
	public int n ;
	public int returnAddress;
	
	public Params(int nn , int ra){
		this.n = nn;
		this.returnAddress = ra;
	}
}
没啥好说的,然后是重点,如何进行模拟功能,先上代码吧,再一步步说明:

	private static boolean step() {
		switch (codePart) {
		case 1:
			theseParams = new Params(theNumber, 6);
			theStackX.Push(theseParams);
			codePart = 2;
			break;
		
		case 2:
			theseParams = theStackX.peek();
			if (theseParams.n == 1) {
				theAnswer = 1;
				codePart = 5;
			}else {
				codePart = 3;
			}
			break;
			
		case 3:
			Params newParams = new Params(theseParams.n - 1, 4);
			theStackX.Push(newParams);
			codePart = 2;
			break;
			
		case 4:
			theseParams = theStackX.peek();
			theAnswer = theAnswer + theseParams.n;
			codePart = 5;
			break;
			
		case 5:
			theseParams = theStackX.peek();
			codePart = theseParams.returnAddress;
			theStackX.Pop();
			break;
			
		case 6:
			return true;
		default:
			
			break;
		}
		return false;
	}
大家看着有点闷吧,整体来说就是将所给的元素压入栈中,再来一个个的出栈进行叠加,而叠加的结果会放在哪里呢,就是放在另一个内存空间,放在一个新的成员变量里面,我们举例说明比较好,比如我们传入一个整数5,第一次,case为2,则将数据5 与 标记 6 放入栈中,然后跳转到case为3,重复步骤case2,将所有的元素入栈后,就可以出栈了,而case2中的判断语句正是判断是否全部入栈(假设我们是从1开始加的),从而跳转到case5,在case5中执行出栈步骤,并且不断与case4循环,重复叠加,最后跳转出来。

这样说可能有点抽象,先给出全部代码,大家了解下为何要标识数:

public class StackTriangleApp {
	static int theNumber;
	static int theAnswer;
	static StackX theStackX;
	static int codePart;
	static Params theseParams;

	public static void main(String[] args) throws NumberFormatException, IOException {
		System.out.print("Enter a number: ");
		theNumber = getInt();
		recTriangle();
		System.out.println("Triangle= " + theAnswer);
		
	}

	private static void recTriangle() {
		// TODO Auto-generated method stub
		theStackX = new StackX(1000);
		codePart = 1;
		while (step() == false) {
			;
		}
	}

	private static boolean step() {
		switch (codePart) {
		case 1:
			theseParams = new Params(theNumber, 6);
			theStackX.Push(theseParams);
			codePart = 2;
			break;
		
		case 2:
			theseParams = theStackX.peek();
			if (theseParams.n == 1) {
				theAnswer = 1;
				codePart = 5;
			}else {
				codePart = 3;
			}
			break;
			
		case 3:
			Params newParams = new Params(theseParams.n - 1, 4);
			theStackX.Push(newParams);
			codePart = 2;
			break;
			
		case 4:
			theseParams = theStackX.peek();
			theAnswer = theAnswer + theseParams.n;
			codePart = 5;
			break;
			
		case 5:
			theseParams = theStackX.peek();
			codePart = theseParams.returnAddress;
			theStackX.Pop();
			break;
			
		case 6:
			return true;
		default:
			
			break;
		}
		return false;
	}

	private static int getInt() throws NumberFormatException, IOException {
		int a = Integer.parseInt(getString());
		return a;
	}

	private static String getString() throws IOException {
		InputStreamReader inputStreamReader = new InputStreamReader(System.in);
		BufferedReader buf = new BufferedReader(inputStreamReader);
		String str = buf.readLine();
		return str;
	}

}
笔者来画个图形象说明下这里面是如何出栈的吧:



画的有点丑,无妨了,大概就是这样,有什么疑问可以在评论说,笔者会参与讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用栈模拟递归的算法 的相关文章

  • vagrant(四):共享目录

    vagrant共享目录 共享目录synced folder 参数共享目录类型 共享目录 共享目录可以设置Vagrant在宿主机 host 和虚拟机 guest 之间同步文件 xff0c 这样做的好处是可以在宿主机上开发 xff0c 在虚拟机
  • FSL的python和R语言接口

    FSL除了本身支持shell命令调用以外 还有一些其他语言的工具包 例如 python和R fsl的python编程库称为fslpy 是可视化工具FSLeyes的一部分 fslpy目前支持python 3 5 3 6 and 3 7开发环境
  • linux rm 命令误删文件恢复

    不小心用rm命令删错了文件 该怎么办 查看分区和文件格式 误删的文件在哪里 首先 用rm命令误删了文件 并不是不可以恢复 首先需要查看一下误删文件所在的分区和文件格式 df T 文件系统 类型 1K 块 已用 可用 已用 挂载点 dev s
  • MRI相关的基本概念

    磁共振基础 磁共振 磁共振 mageticresonanceMR xff1b 在恒定磁场中的核子 xff08 氢质子 xff09 xff0c 在相应的射频脉冲激发后 xff0c 其电磁能量的吸收和释放 xff0c 称为磁共振 基本参数 TR
  • 服务器搭建: 用户管理

    文章目录 查看当前用户用户类型多用户管理用户和用户组的概念添加用户adduser命令useradd命令 用户组管理给用户添加sudo权限删除用户 备注 xff08 1 xff09 etc passwd文件 xff08 2 xff09 etc
  • scikit learn工具箱pipeline模块:串联方法

    scikit learn工具箱pipeline模块 xff1a 串联方法 pipeline模块 scikit learn工具箱的pipeline模块提供了将算法模型串联 并联的工具 xff0c 多个estimator并联起来用于模型结果比较
  • ANOVA与机器学习

    文章目录 方差分析ANOVA组间变异和组内变异均方差F分布与F值方差分析的关键条件 Anova在机器学习中的应用 特征选择总结更多阅读 方差分析ANOVA anova analysis of variance 方差分析 又称 34 变异数分
  • FSL 功能磁共振影像分析: single-session

    文章目录 什么是single session分析基于HRF的模型信号多元回归t contrastf contrast single session分析是fmri实验分析的最简单情况之一 xff0c 这里以FSL官方的例子为例 xff0c 总
  • MRI图像处理:VBM原理和步骤

    VBM是voxel based morphometry的缩写 xff0c 是对被试之间灰质体素粒度统计分析 VBM可以得到人群中volume和gyrification的不同 xff0c 对clinical score进行相关性分析 xff0
  • 创新不是靠痛点,而是靠对效率的持续追求

    什么都等到痛了才去做 xff0c 要你何用 在互联网行业做产品 xff0c 亦或是创业给投资人讲故事 xff0c 一个很核心的点就是要问自己或者告诉对方 xff0c 我的产品击中了什么痛点 xff1f 似乎一切都是靠痛点驱动的 但我认为这是
  • linux压缩文件解压

    文件格式解压方法 zipunzip FileName zip xzxz d FileName tar xz 或者 tar xvJf FileName tar xz bzbzip2 d FileName bz 或者 bunzip2 FileN
  • linux开机启动顺序

    文章目录 linux的开机启动顺序概述BIOS basic input output system 基本输入输出系统MBR master boot record 主引导记录 主引导程序总结 第一个程序 init运行等级System V in
  • 机器学习模型评估与改进: 交叉验证(cross validation)

    文章目录 交叉验证调用方法优势和不足注意事项 xff1a 分层k折交叉验证交叉验证的更多变形leave one out交叉验证Shuffle split交叉验证组间的交叉验证 总结 以监督学习的众多算法为例 xff0c 不管是分类还是回归
  • MRI机器学习工具箱nilearn: masker

    masker 对象的概念 对于任何基于神经影像的研究来说 第一步都是要加载数据 由于通常MRI是3D的 fmri加上时间这个轴 是4D的 对于机器学习模型来说 这种4D的数据结构不便于分析 nilearn中 masking data 本质上
  • 机器学习模型评估与改进:网格化调参(grid search)

    文章目录 简单网格化搜索参数过拟合的风险网格搜索与交叉验证 模型调参接口 GridSearchCV函数整体流程GridSearchCV 函数对交叉验证进一步分析不同核方法的情况网格化搜索中应用其他交叉验证策略嵌套交叉验证并行化 总结附注 x
  • 特征工程: 特征, 特征提取和特征选择

    文章目录 机器学习中的特征特征的重要性 特征提取和特征选择去除方差较小的特征单变量特征选择 Univariate feature selection F检验与互信息 其他特征选择方法重复性特征删除 用模型选择 并入pipeline 机器学习
  • 模型评估:评估矩阵和打分

    文章目录 目标优先二分类问题的评价指标第一类错误和第二类错误非均匀数据集混淆矩阵 正确率 精确率 召回率和f score不知道标签均匀性的情况精度 召回曲线和ROC曲线精度 召回曲线 xff08 precision recall curve
  • UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法

    有关UEFI BIOS基础知识的简介 xff0c 一年前在网易博客做过详细的概述 鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解 xff0c 虽然网上有各式各样的启动修复工具 xff0c 但是对于新手来说 xff0c 如果不明

随机推荐

  • spark python脚本在命令行的执行方法

    有时候我们的pyspark代码需要在服务器上运行 xff0c 那么具体的运行方法是什么呢 xff1f pysprk aa py 只需要在pyspark后面写上自己想要运行的python文件即可 xff0c 是不是很简单 xff0c 哈哈哈
  • 迁移Linode服务器

    迁移Linode服务器 从美国将Linode的一个服务器迁移到日本的机房 xff1a 1 首先为了保证数据的完整性 xff0c 把两台VPS主机都关机 2 到新的VPS主机控制面板那样把Disk Image和Swap Image给删除了 x
  • JAVA 正则表达式 (超详细)

    新网站上线 欢迎大家 网站交易中心 在这里你可以购买或者出售你的网站 网站信息发布中心 在这里有各种交易信息的发布 同时提供 一些软件的免费使用 xff08 附有源码 xff09 网站博客系统 这里你可以注册自己的博客 一个账户无限量博客
  • mysql查看binlog日志内容

    mysql的binlog日志位置可通过show variables like 39 datadir 39 查看 xff0c 直接打开无法查看 xff0c 要看其内容2个办法 xff1a 1 登录到mysql查看binlog 只查看第一个bi
  • 常用模拟器及ROM下载地址

    Nintendo Nintendo Entertainment System Super Nintendo Entertainment System Nintendo 64 Project64 https www pj64 emu com
  • Linux下安装jdk配置报错:-bash: java: command not found

    可能是jdk解压有问题 xff0c 重新解压然后source etc profile xff1a 使配置生效 再 java version来查看配置成功没
  • IP地址段范围写法

    A类IP段 0 0 0 0 到127 255 255 255 B类IP段 128 0 0 0 到191 255 255 255 C类IP段 192 0 0 0 到223 255 255 255 XP默认分配的子网掩码每段只有255或0 xf
  • 有时间细读这些书

    1 Windows程序设计 第5版 珍藏版 xff1a 这是很经典的一本介绍Win32 API编程的书了 xff0c 基本介绍到了大多数关于Windows程序设计的基本内容 2 Windows程序设计 王艳平版 xff1a 这本和上一本的区
  • linux中systemctl详细理解及常用命令

    一 systemctl理解 Linux 服务管理两种方式service和systemctl systemd是Linux系统最新的初始化系统 init 作用是提高系统的启动速度 xff0c 尽可能启动较少的进程 xff0c 尽可能更多进程并发
  • Linux查看网速命令

    watch 34 ifconfig eth0 grep byte 34
  • 软件正在改变世界,程序员应该得到足够尊重

    软件无处不在 xff0c 越来越多的人离不开软件 xff0c 你打开电脑 xff0c 你使用手机 xff0c 你购物娱乐 软件一直在帮你 xff0c 软件已经渗透到我们的工作 生活 娱乐的方方面面 xff0c 软件每一天都在改变着这个世界
  • apache2.4 配置多个版本的 php7,php8)

    不多说 xff0c 直接上配置修改 httpd conf lt IfDefine php7 gt Listen 82 LoadFile 34 D php 7 2 34 libssh2 dll 34 LoadModule php7 modul
  • 叉乘怎么记忆,计算

    以一个例子直观记忆叉乘 xff1a 引用自 向量积 百度百科 baidu com 在这个式子中 xff0c 我们可以清楚地看到三项分别是i xff0c j xff0c k 前面则是他们的系数 我们可以直接把i xff0c j xff0c k
  • 接口防重方案设计

    幂等性原理 xff1a 前台的多次请求 xff0c 对于后台 xff0c 也是同一次请求 xff1b 通常接口设计方式 xff1a 1 前端的页面提交按钮置灰 xff0c 防止用户重复点击 xff1b 2 对前端提交的token进行校验 x
  • Spark Streaming 与 Kafka 集成分析

    前言 Spark Streaming 诞生于2013年 xff0c 成为Spark平台上流式处理的解决方案 xff0c 同时也给大家提供除Storm 以外的另一个选择 这篇内容主要介绍Spark Streaming 数据接收流程模块中与Ka
  • 微信小程序-轮播图实现

    好久不见 xff0c 今天小h来分享一下如何实现一个微信小程序的轮播图实现方式 xff1a 前提条件是具有微信开发者工具 xff0c 还有对应的开发者ID xff0c 这些基础条件我这边就直接跳过了哈 xff0c 直接进入正题 xff1a
  • 所以,到底什么是微服务?

    1 微服务是一种软件架构 xff0c 是聚焦在单一的职责和业务功能 xff0c 具有独立的进程 xff0c 能够单独运行的服务 xff0c 并且与外部服务是通过HTTP进行交互通信的服务 2 微服务比较常见的特性是 xff0c 具有单一职责
  • 关于云服务Bmob的使用方法(上)——上传数据

    关于第三方云服务平台Bmob是怎样使用的 xff1f 我们从两个方面来写 xff0c 一个是传输数据 xff0c 一个是传输文件 第一个是关于bmob传输数据的 xff0c 首先我们在官网http www bmob cn 上面注册我们自己的
  • 关于云服务Bmob的使用方法(下)——上传文件

    上一篇我们说了如何传输数据 xff0c 那么这一篇我们进阶一下 xff0c 来谈谈如何传输文件 xff0c 比如图片 关于如何在bmob上注册和申请 xff0c 上一篇已经有说明 xff0c 不懂的读者可以去看看 xff0c 然后我们直接进
  • 使用栈模拟递归的算法

    这一篇笔者要讲的是如何用栈来模拟递归 xff0c 或者说替代递归的算法 xff0c 现在我们假如要算从三角形数的叠加 xff0c 比如输入10 xff0c 输出是55 xff0c 输入是100 xff0c 输出是5050 xff0c 等等