我们大家都知道,我们在学习每一门语言的时候,基本上的人都写了计算器,那么你还记得你当时为了实现连加,连乘,连除,连减,多层括号是如何实现的么,如果你用了几十行就搞定了,那么你是高手,当然了,这里就是来介绍是如何实现的,这是我当时写计算器的时候采用的方法,如果喜欢记得点赞哦。。。
一.先实现没有括号的连加运算
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答案是正确的!
所以就是这里不一样,其他还是和加号一样是自己调用自己,如此已经实现了连加连减的混合运算啦
可以看到都是没有问题的
三.实现连加连减连乘法
我们前面已经实现了连加连减,所以走到减号判断的下面的等式是没有加号和减号啦
走到箭头的标记处的等式是只有"*"和"/"啦,所以我们现在就实现对乘号的判断,原理一样,我就不解释了,直接上代码了
和加号一样,是不是很简单了?那么最后除号也一并解决吧
到这里已经实现了+-*/的混合等式的运算,而且代码量简直就是少的可怜,后面还是复制粘贴的,这里最关键就是让大家理解递归的思想,一个方法我比喻成一个小孩子,开始值认识一个字符串的数字,后来能认识"+",知道了拆分。。。。。然后成为了大人,成功学会了混合运算
这里我对代码进行测试
可以看到都是没有问题的,那么小金子我先吃饭啦,后面的括号的实现,容我吃完饭,下一个博客再给大家说哈