Summary Ⅰ( 三 )


第二个问题是问题:将优化分散到每个和每个Term,为了方便合并同类项选择了先排序再合并,但由于自己的排序函数并没有出现达到自反性,对称性,导致排序函数出问题;具体报错信息如下:
its!
(没有满足可逆比较)
测试点:
f(x)=x*sin(x)
g(x)=(2+x-sin(x))**3
0-((y+1)*cos(0)**2-f(0))*g(z)
:.("java.util..", "true");
TLE测试点:
f(x)=cos(x)
g(x,y)=cos((-y))*cos(x)-sin((-y))*sin(x)
h(y,x)=f(x)*sin(y)*f(x)+sin(y)*sin(y)*sin(x)

Summary Ⅰ

文章插图
dx((-(x*x-5))- ((g(sin(x),f(sin(x)**1)))**+2))+h((x*g(x**2,(x*x))),x)
:经过测试发现,求导耗费时间较长,优化方式为:若当前因子中不包含待求导因子,则直接返回0,无需按照表达式的要求进行逐步递归求导,可以大大提高效率 。经修改,节约了8s左右,成功AC
第四部分--研讨课交流收获
第二次作业选择了重构,研讨课上组员特别强调了对于函数替换的情况,为了防止形如f(x) = x**2 ; f(x**2) = x**2**2的情况出现,选择给每个形式参数都带上括号,即展开后结果为:(x**2)**2 。令人受益匪浅,同时,有同学提出,如何对sin**2 + cos**2的合并,以及sin(x)cos(y) + cos(x)sin(y) = sin((x+y))的合并,也让人耳目一新 。
第五部分--程序质量分析
第一节:基于度量来分析程序结构
Cal:保存函数计算方法的计算类;
字段:保存函数的操作运算符和形参的传递顺序
无方法;
:接口:
定义方法有:,,,,
所以所有继承自的因子类都重写了如上方法,故不在赘述
Der:求导因子类;
字段:求导的对象和带求导表达式
方法:转化为Expr(展开时,Der因子会被展开为Expr形式)
Expr:表达式因子:
字段: 以及
方法:用于排序与合并类的比较方法;Expr*Expr,Expr+(-)Expr;求导方法;方法;
Func:函数因子
字段: (用于保存运算的实参);Cal,计算的类,即该函数的计算方式
方法:,展开后为Expr
Norm:常规因子
形式:系数*x**指数*y**指数*z**指数
故字段有表示一个系数和三个指数
方法:,,(求导),(优化指数为0或者为1)
Trig:三角函数因子
字段:,expr(内嵌表达式),(指数)
方法:;(优化指数)
Term:项
字段:
方法:(加入新的),,,(用于排序和比较),sort
Lexer和类为词法和语法分析器,较为常规
为常用的字符串处理函数,其中函数为静态方法
第二节:计算经典的OO度量,分析类的内聚和相互间的耦合情况
分析:Trig和与其他模块的耦合度较高 。
与其他模块的耦合度较高原因是:作为分支函数,会进行复杂度较高的分流工作,将抽象的转化为具体的,,等,因此作为中转分支枢纽,自然耦合度较高;
Trig与其他模块的耦合度较高原因是:Trig中含有Expr因子,Expr因子中可以包含多个Term和,这在一定程度上增加了耦合度;同时Trig求导尤其复杂,在求导过程中,涉及对内嵌因子的递归求导,不仅加大了求导难度和而且大大增加了与各种内嵌因子的耦合程度 。可以形象地说,三角因子不过是Expr因子套上sin/cos外套而已 。
第三节:架构设计体验
Ⅰ.分析自己程序的bug
Ⅱ.分析自己发现别人程序bug所采用的策略
第六部分--心得体会
方法论:面对困难千万不能放弃,在没有思路的情况下,最好的前进方式是耐心品味老师的指导(比如ppt),老师的设计思路一定值得我们去品鉴,很多时候是我们唯一合理的突破点 。