前情提要
开局暴击是OO课程的传统,笔者在第一次作业的时候就遇到了很大的麻烦,花费接近40个小时才最终完成作业,虽然最后结果还算不错,但确实见识到了OO课程的厉害。
坦诚而言,上学期所学的OO先导课程在本单元作业中发挥了重要作用。特别是冒险者的那个单元,无论是从面向对象项目结构,还是Java程序的工程结构,都“何其相似乃尔”!本单元我认为比较重要的内容有以下几点:
- 递归下降的学习和使用
- 抽象层次结构的建立
- Java语法糖结合相关算法的使用
- 评测机的搭建和完善
虽然基本的多项式(expr/factor)-单项式(node)的结构已经建立,但我在运用算法的时候遇到了麻烦,不知道该如何处理。我的问题出在如何由底层的Factor回到表达式。因为有这个存在,导致单项式经过运算之后也有可能变成多项式,在第一次作业中我尝试在node中使用Set装填node运算之后的结果,但是这样导致了结构的混乱,因为node会自己装填自己。于是在之后的作业中,我取消了单项式-多项式的继承关系,用接口统一它们相同的功能。
无论是乘法、乘方、还是求导,都可以抽象为这样一个过程:
- 构建单项式,组成多项式
- 多项式,进而运算其中的单项式
- 运算单项式,产生多项式(内含多个单项式)
- 返回多项式,将其中的单项式添加到被运算的多项式中
这是一个可以的过程。
第三次作业思路
支持求导
说了这么多,和第三次作业有什么关系吗?当然有!在第三次作业中我们就要强化并完善这样的过程:
由于所有的运算都是直接对多项式进行的,只有调用了多项式的相关方法,才会调用单项式的相应功能。
于是便有了这样一个流程:
举个例子:
\begin{align} &\text{d}x(x ^ 3 y \sin(cos(x)) \cos(x ^ 2)) \notag \\ & = \text{d}x(x ^ 3 y) \sin(cos(x)) \cos(x ^ 2) + x ^ 3 y\text{d}(sin(cos(x)) \cos(x ^ 2)) \notag \textbf{ 分幂函数和三角函数处理} \\ & = 3x^2y \sin(cos(x)) \cos(x ^ 2) - x^3y cos(cos(x)) sin(x) cos(x ^ 2) - 2x^4y sin(x ^ 2) sin(cos(x)) \notag \textbf{ 分别计算得到多项式} \end{align}
自定义函数
自定义函数,只需要便定义边解析,也即在定义的时候把函数当作普通表达式,根据已定义的函数解析即可。
至于实现的话,每个人有自己不同的实现方式,大佬们也给了很多思路,我就不再赘述。
第一次写讨论文章,如有不足还请大家多多包涵qwq。