计算器核心算法(一)
我们大家都知道,我们在学习每一门语言的时候,基本上的人都写了计算器,那么你还记得你当时为了实现连加,连乘,连除,连减,多层括号是如何实现的么,如果你用了几十行就搞定了,那么你是高手,当然了,这里就是来介绍是如何实现的,这是我当时写计算器的时候采用的方法,如果喜欢记得点赞哦。。。
一.先实现没有括号的连加运算
2+5+6
上面是一个简单的等式,我们的任务就是能计算出它的结果,首先你看到这个你可能也会想到拆分,把每一个字符拆分到集合中,然后进行判断处理,但是今天只采用拆分,不采用集合
上面的等式可以拆分成 "2" "+" "5" "+" "6"
现在开始顺着我的思路走哦~~~
可以看到我定义了一个parse方法,我就像通过调用这个方法就能返回正确的结果,那么我们先实现最简单的一种
直接返回字符串的双精度的值,那么你们有疑问了,这有什么软用?不,我告诉你,这有用,-->它实现了一个字符串的数字转化成了一个真正的数字
可以看到这里顺利的完成了转化,现在不理解没关系,往下看
现在的这个方法就好像一个小孩子,它只认识字符串的数字
那么现在孩子慢慢长大,他遇到了加号+
这时候这个小孩子根本不会算,但是他发现他会算里面的一部分,也就是里面的"2"和"5"
于是这个小孩子把它拆出来,于是parse方法就多了一个判断,如下:
可以看到,它对加号前后进行了拆分,然后又调用自己,因为拆出来的是一个字符串的数字,这个孩子之前就已经认识它了,所以调用自己能算出结果,然后中间采用加号相加,这样子就实现了"2+5"
如果跟着写的亲们,自己就应该能发现,这里不仅实现了"2+5"还实现了"2+5+6+8"连加的功能,哇塞,好神奇啊发现,这是因为这个方法它发现加号就会拆分,所以"2+5+6+8" 就变成了"2" + "5+6+8" --> "2" + "5" + "6+8" -->"2" + "5" + "6" + "8"
这样子拆出来的每一个都是一个字符串的数字,所以都能算出来并且返回
这就是递归,很多时候递归确实只能靠自己想,我也很难给你们讲清楚,但是递归和while循环有一点是一样的,必须有一个条件是终止的,在递归里面就是必须有一个时候是要有确定返回值的,我们这里确定的返回值就是return Double.parseDouble(content);
大家好好理解一下,虽说代码就几句,但是里面意义还得靠大家自己仔细研究研究。好了话不多说,我们接下去分析
之前我们为什么拿"+"先作判断,这是因为加号两边的等式是可以先算出来的,不影响最后的结果,如果不懂,请回到小学课堂,听老师再给你念叨念叨~~~~
二.实现加减混合的计算
我们知道上面我们已经实现了连加,其实连减的道理也是一样的
图中标记出来的地方,如果代码走到了这里,说明等式里面已经没有"+"了,为什么呢,因为"+"上面有判断,如果存在就直接再if语句中返回了,所以走到了标记处等式中必须没有"+"号
"2-3+8-4" 那么如果现在的字符串是这样子的,会被拆分成"2-3" "+" "8-4"
加好两边还是调用parse方法,"2-3"这个等式就走到了标记的地方,然后现在这个方法不能算啊,除了加好不认识其他的,所以标记的地方又得做相同的判断了
可以看到做了一个和"+"号很类似的判断,只不过寻找减号的方法是lastIndexOf("-") 为什么是这个呢,因为最后一个减号前后的等式先计算这是不影响结果的
假如一个等式"8-2-6" 答案是0大家都是知道的,如果你弄成"8" - "2-6" 这就完全不一样了,这个值就变成了 8-(-4) -->8+4-->12
但是你按照最后一个减号前后拆分 "8-2" - "6" --> "6" - "6" -->0答案是正确的!
所以就是这里不一样,其他还是和加号一样是自己调用自己,如此已经实现了连加连减的混合运算啦
可以看到都是没有问题的
三.实现连加连减连乘法
我们前面已经实现了连加连减,所以走到减号判断的下面的等式是没有加号和减号啦
走到箭头的标记处的等式是只有"*"和"/"啦,所以我们现在就实现对乘号的判断,原理一样,我就不解释了,直接上代码了
和加号一样,是不是很简单了?那么最后除号也一并解决吧
到这里已经实现了+-*/的混合等式的运算,而且代码量简直就是少的可怜,后面还是复制粘贴的,这里最关键就是让大家理解递归的思想,一个方法我比喻成一个小孩子,开始值认识一个字符串的数字,后来能认识"+",知道了拆分。。。。。然后成为了大人,成功学会了混合运算
这里我对代码进行测试
可以看到都是没有问题的,那么小金子我先吃饭啦,后面的括号的实现,容我吃完饭,下一个博客再给大家说哈
计算器核心算法(一)相关推荐
- 用计算机连乘带加怎么算,计算器核心算法(一)
我们大家都知道,我们在学习每一门语言的时候,基本上的人都写了计算器,那么你还记得你当时为了实现连加,连乘,连除,连减,多层括号是如何实现的么,如果你用了几十行就搞定了,那么你是高手,当然了,这里就是来 ...
- 阿里资深AI工程师教你逐个击破机器学习核心算法
01 近年来,随着 Google 的 AlphaGo 打败韩国围棋棋手李世乭之后,机器学习尤其是深度学习的热潮席卷了整个 IT 界. 所有的互联网公司,尤其是 Google 微软,百度,腾讯等巨头,无 ...
- 核心算法缺位,人工智能发展面临“卡脖子”窘境
http://www.xinhuanet.com/politics/2019-04/30/c_1124435131.htm "徐匡迪之问"引发业界共鸣-- 核心算法缺位,人工智能发 ...
- SQL关键字转换大写核心算法实现
1 不跟你多废话 上代码! /// <summary>/// SQL关键字转换器/// </summary>public class SqlConverter : IKeywo ...
- x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode() 宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_m ...
- 【视频课】零基础免费38课时深度学习+超60小时CV核心算法+15大Pytorch CV实践案例助你攻略CV...
计算机视觉中大大小小可以包括至少30个以上的方向,在基于深度学习的计算机视觉研究方向中,图像分类,图像分割,目标检测无疑是最基础最底层的任务,掌握好之后可以很快的迁移到其他方向,比如目标识别,目标跟踪 ...
- 医疗软件产品核心算法部分说明--转载截取
各方资料汇总说明 核心算法概述 算法类型: 公认成熟算法:公开文献专利标准.原理简单明确.上市超过四年且无不良时间.公认成熟算法名称.原理.用途,全新算法列明名称.原理.用途,并提供验证资料. 全新算 ...
- kylin分析引擎:运行原理、维度和Cube等名词解释、核心算法
架构 kylin是一款分析引擎,最常用的数据源是Hive.1.5版本之后数据源增加了kafka,但最常用的仍然是Hive.但是Hive查询比较慢,Kylin解决了这一问题. 大致流程: 第一步:从Hi ...
- 重磅下载!业界首本强化学习应用宝典,阿里核心算法团队联袂打造
作为一名技术人,你是否曾有过这样的疑惑: 人工智能大热,作为一名传统程序员,该如何转型或学习? 网上AI教程.书籍,质量参差不齐,如何找到真正专业的资源? AI理论遍地皆是,但几乎都在纸上谈兵,该从哪 ...
最新文章
- Burpsuite学习(4)
- python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例
- 后台开发经典书籍--linux性能优化
- (37)zabbix snmp类型 无需安装agent也能监控
- [导入]用Javascript实现interface的类似功能
- MySQL存储过程及触发器
- MySQL(介绍,安装,密码操作,权限表)
- 习题2.6 递归求简单交错幂级数的部分和 (15 分)
- 在线node服务器,如何将你的node服务放到线上服务器
- android 如何快速检测到画面变化_电瓶修复—如何快速检测电池的好坏2
- LWN:Fedora 关于无驱动打印的讨论!
- OpenCV——图像连通域
- 【Python】新华字典(bushi
- bxl文件转换为AD可以用的原理图和PCB库文件
- 【MYSQL】foreign key 外键约束(详解)
- halo开源博客搭建微信小程序实现内容同步-总结
- html文章目录自动生成,javascript:如何自动生成一篇文章的目录
- 键盘输入10个正整数,先打印输出奇数,再输出偶数
- 显示hosts文件为只读问题
- java遍历指定目录下所有文件