301
社区成员
发帖
与我相关
我的任务
分享目录
第一单元主任务:单变量多项式的括号展开。
在hw1中,仅需将一个包含+、-、*、^以及括号(单层)的单变量表达式,输出展开所有括号的结果。
hw2新增了多层括号,自定义函数因子和指数函数因子。
hw3新增求导算子。
采用了递归下降法。一个表达式可以拆分成若干项(由+、-符号连接),因子可以分为表达式因子,数字和幂函数。在完全化简后,表达式由若干以下项构成,即c*x^n。
我的主要思路是,先解析表达式,再利用基本项的性质运算,最后输出。UML类图如下。

Factor接口下的类是递归下降方法的核心。Power类存储形如c*x^n的项,Poly类负责运算工作。
类复杂度如下。Poly类的基本复杂度较高,大概是因为我将全部的运算,以及部分输出表达式工作写在了Poly里。

在第一次作业的基础上,新增了自定义函数类。对于输入表达式中的的自定义函数,采取带入实参替换的方式预处理。修改Power类的定义,用hashmap存储exp。修改Poly类,新增有关exp的运算。
需要注意,在替换时处理exp与x的关系,以及先将形参替换成其他字母,再替换实参。复杂度问题与hw1类似。

新增求导算子。这部分需要注意的问题是:dx可以多次出现,以及正确使用链式法则。我最大的问题是,把求导方法也写进了power类里,而没有采用类似第二次上机的架构,即递归实现求导功能。类复杂度图也能反映出这个问题。

三次作业在强测和互测中均没有出现bug。
自己测出来/跑评测机发现的bug如下:
hw1:因为没有仔细分析形式化表述,未考虑形如x^{+1}的情况。
hw2:在输出exp时是否要格外加括号的判定问题。
hw3:一开始没有注意到,dx可以多次出现。
互测:
hw1:同房的一位同学在处理输出结果时的bug,如果末位项为1,会无法输出1。
hw2与hw3:没有hack到。
hw1:需要优化的部分是,尽量不让首项为负。如x-1优于-1+x。
hw2:比较容易想到和实现的是,输出exp时判断是否需要格外加括号。比较复杂的是指数函数的优化。看了评论区的优化方法,但因为能力有限,且考虑到优化后可能的bug,选择正确性优先。这也导致后两次作业性能分惨淡。
hw3:未考虑。
第一单元有惊无险结束,非常感谢助教、开发评测机的同学、以及hw2与我交流相同测试点问题的同学们。希望我在下一单元的多线程学习中有更多收获。