OO_HW1思路总结——一种极简的实现方法

本来打算3.4写完作业就写篇总结的,硬是给我拖到了现在...

昨天敲完代码就开始摸鱼摸完鱼八点就睡觉今天醒来写了一篇基物实验报告又开始摸鱼还拿拉姆的电脑打了半天游戏

总体评价

我对自己的这次作业的完成还是比较满意的:

  • 虽然代码写的乱七八糟但是很简洁
  • 另一个满意的地方体现在策略方面:在不用预解析做不出来的情况下更换了方法,用预解析写完了之后突然灵光一现,第二天很快就做了出来(我要时时刻刻提醒自己:不要钻牛角尖

实现方法

如非必要,勿增实体。

——奥卡姆剃刀原理

其实是在写总结的时候才想到这句,为自己的偷懒找个理由

解析

第一步:去掉所有的空格和'\t'

我没有刻意去学“向下递归”(懒),这个词看起来似乎很好理解:就是“向下”+“递归”

就是把大问题转化为小问题,直到数量有限的、满足一定格式的最小“原子”。更加形象的说,是一种类似于剥洋葱的方法(我不知道我理解的对不对)。所以解析的难点就在于从哪里开始剥这个洋葱,以及如何把这一层洋葱皮完整的剥下来

洋葱皮就是一层一层的括号、加减号、乘号......

(插一句:我是在那天上完机看了别人的代码之后才开窍的)

知道了应该做什么之后,下一步就应该研究怎么做。

要点在于:只要找到第一个能把表达式分成两部分的加减号/乘号/幂运算符号,就能把表达式分为两个部分。

进一步地:只要找到括号外第一串连着的、不在待解析字符串开头的加减号,或者括号外第一个乘法符号,或者括号外第一个乘方符号,就可以以这个为界,将整个表达式分为两个部分。

这个具体实现写几个函数就很方便!

在这个过程中还要关注每一项的正负,我是这么处理的:

把连着的一串正负号看成一个整体,作用于其后紧跟着的项,在递归计算出后面这一项之后取反或者不取反。这一堆正负号就相当于洋葱的一层皮,扒掉,再解析后面的部分。

数据的组织方式

我觉得自己的方案简单主要体现在这一点。

最终参与输出的只有这么几个类:Term类(多项式的项)、Number类(单独的数字,这个其实是Term的子类)、Sum类(这三种类的对象的求和,也许叫Add更合适,因为是两项求和)。

乘法和乘方呢??都被我在解析过程中识别并处理掉了。(上面三种基本类都是支持加减乘运算的)

所以就是说,我这个程序运行的整个过程中数据就经历了两种形态:原始字符串解析后的Sum类

这样输出也很简单。

我这种脑子比较简单的人可能就适合简单的方法

心路历程

最最开始,我想着先把原始表达式用加减号拆分,拆分之后呢?(那时候还不清楚递归具体应该怎么实现

我又愚蠢的构造了一个人不人鬼不鬼的“表达式类型”:带正负号的字符串(笑死),然后就不知所措了,似乎这个愚蠢的类把自己保护了起来,我:???

中间还走了一段歪路:我最初想的是Sum里面放一个包含参与求和的项的ArrayList,这样也有些蠢,没有发挥递归的精神。这样处理很麻烦,复杂度远超出了我的能力(也许优点是速度比较快?)

最后想到上面那种实现方法是因为想到通过找括号外的特殊符号的办法来拆分字符串,然后就做出来了。


我不知道花了多久,才逐渐学会承认自己能力有限。

这篇总结就这样啦!我本来也想写一篇能发讨论区的文章,可是鸽太久了,人家代码都写完了,没脸发,下次吧