BUAA-OO-Unit1

冉啟何-22373028 学生 2024-03-20 01:55:33

BUAA-OO-Unit1

前言

第一单元的总任务为表达式括号展开。三次任务分别为单变量多项式展开含指数函数与自定义函数的多项式展开含求导因子的多项式展开。第一单元的任务目标可以总结为学习面向对象的思想,从数据与行为两个角度认识对象,并且掌握层次化设计理念。

总体上来说,由于有先导课程的铺垫以及助教们介绍的递归下降这一核心处理思想的帮助,本次作业总体上实现阻碍不大。但在输出结果优化以及一些细节上的实现仍然有一定的挑战。尤其是第一次作业到第二次作业有一定的跨度。不过最后还是顺利度过,下面是我对第一单元的总结与思考。

第一次作业

UML类图

img

代码架构分析

预处理

StringProcessing类对输入进行预处理,主要做到:删除空白项合并连续的加减正负号删除前导零

表达式解析

表达式一共包含三层:ExprTermFactorFactor有三种:幂函数, 常数函数,表达式因子。

因此,要做的就是如何将给出的表达式解析成ExprTermFactor

这里使用助教们讲解过的递归下降算法

解析语法单元:Lexer

功能:将输入分解为一个个Token

Token

public enum Type {
    ADD, SUB, MUL, CARET,
    LEFT_P, RIGHT_P,
    VAR_X, NUM
}

Lexer

while (pos < expression.length()) {
    if (expression.charAt(pos) == '(') {
        ...
    } else if (expression.charAt(pos) == ')') {
        ...
    } else if (expression.charAt(pos) == '*') {
        ...
    } else if (expression.charAt(pos) == '^') {
        ...
    } else if (expression.charAt(pos) == 'x') {
        ...
    } else if (expression.charAt(pos) == '+') {
        ...
    } else if (expression.charAt(pos) == '-') {
        ...
    } else {
        ...
    }
}
解析表达式:Parser

Parser类的功能为将Lexer解析为三部分ExprTermFactor

实现思想就是根据当前Token判断下一项是ExprTermFactorNumPowerExprFactor

public Expr parseExpr() {
    ArrayList<Term> terms = new ArrayList<>();
    ...
    terms.add(parseTerm(sign));
    while (下一Token为Term开头) {
        ...
        terms.add(parseTerm(sign));
    }
    return new Expr(terms);
}

public Term parseTerm(int sign) {
    ArrayList<Factor> factors = new ArrayList<>();
    factors.add(parseFactor());
    while (下一Token为Factor开头) {
        ...
        factors.add(parseFactor());
    }
    return new Term(sign, factors);
}

public Factor parseFactor() {
    ...
    return new Factor();
}

代码复杂度分析

代码规模

Source FileTotal LinesSource Code LinesSource Code Lines[%]Comment LinesComment Lines[%]Blank LinesBlank Lines[%]
Calculate.java83750.90400.080.096
Constant.java40320.810.02570.175
Expr.java20160.800.040.2
ExprFactor.java35300.85700.050.1429
Factor.java331.000.000.0
Lexer.java75680.90700.070.0933
Main.java22190.86410.045520.091
Monomial.java51450.88200.060.118
Num.java17140.82400.030.17653
Parser.java85780.91820.023550.0588
Polynomial.java61530.86900.080.1311
Power.java21170.8100.040.1905
StringProcessing.java82710.86630.036680.0976
Term.java32260.81300.060.1875
Token.java24190.79210.041740.1667

代码复杂度

methodCogCev(G)iv(G)v(G)
Token.Token(Type, String)0.01.01.01.0
Token.getType()0.01.01.01.0
Token.getContent()0.01.01.01.0
Term.toPolynomial()1.01.02.02.0
Term.Term(int, ArrayList)0.01.01.01.0
Term.setSign(int)0.01.01.01.0
Term.getSign()0.01.01.01.0
StringProcessing.removeLeadingZero(String)8.05.04.06.0
StringProcessing.removeAllLeadingZero(String)2.01.03.03.0
StringProcessing.pretreatment(String)0.01.01.01.0
StringProcessing.mergeAddAndSub(String)2.01.03.03.0
StringProcessing.merge(String)5.02.02.04.0
Power.toPolynomial()0.01.01.01.0
Power.Power(int)0.01.01.01.0
Polynomial.toString()1.01.02.02.0
Polynomial.simplifyPolynomial()9.01.07.07.0
Polynomial.Polynomial(ArrayList)0.01.01.01.0
Polynomial.getSize()0.01.01.01.0
Polynomial.getMonomial(int)0.01.01.01.0
Polynomial.addMonomial(Monomial)3.03.03.03.0
Parser.parseTerm(int)2.01.03.03.0
Parser.Parser(Lexer)0.01.01.01.0
Parser.parseFactor()19.05.013.013.0
Parser.parseExpr()7.01.06.07.0
Num.toPolynomial()0.01.01.01.0
Num.Num(String, int)0.01.01.01.0
Monomial.toString()12.01.08.010.0
Monomial.setIndex(int)0.01.01.01.0
Monomial.setCoefficient(Constant)0.01.01.01.0
Monomial.Monomial(Constant, int)0.01.01.01.0
Monomial.getIndex()0.01.01.01.0
Monomial.getCoefficient()0.01.01.01.0
Main.main(String[])2.01.02.03.0
Lexer.pre()1.02.02.02.0
Lexer.post()1.02.02.02.0
Lexer.now()0.01.01.01.0
Lexer.notEnd()0.01.01.01.0
Lexer.move()0.01.01.01.0
Lexer.Lexer(String)21.011.010.013.0
ExprFactor.toPolynomial()5.01.04.04.0
ExprFactor.ExprFactor(Expr, int)0.01.01.01.0
Expr.toPolynomial()1.01.02.02.0
Expr.Expr(ArrayList)0.01.01.01.0
Constant.toString()2.01.02.02.0
Constant.getValue()0.01.01.01.0
Constant.getSign()0.01.01.01.0
Constant.equalZero()0.01.01.01.0
Constant.equalOne()0.01.01.01.0
Constant.Constant(int, BigInteger)0.01.01.01.0
Calculate.mulPolynomial(Polynomial, Polynomial)3.01.03.03.0
Calculate.mulMonomial(Monomial, Monomial)3.01.03.03.0
Calculate.mulConstant(Constant, Constant)0.01.01.01.0
Calculate.findMonomialIndex(ArrayList, int)3.03.02.03.0
Calculate.addPolynomial(Polynomial, Polynomial)0.01.01.01.0
Calculate.addMonoToPoly(Polynomial, ArrayList)1.01.02.02.0
Calculate.addMonoToMonoS(Monomial, ArrayList)2.01.02.02.0
Calculate.addConstant(Constant, Constant)4.01.04.04.0
Total120.082.0128.0140.0
Average2.1051.4392.2462.456

原因分析

  • Lexer类中的Lexer()使用了大量的if...else...解析语法单元,结构较为冗余,代码量较大;
  • Parser类中的ParserFactor()使用大量的if...else...分析因子类型,代码复杂度较高。

第二次作业

UML类图

img

代码架构分析

从第一次作业到第二次作业跨度较大,主要困难如下:

  • 如何解析自定义函数,实现代值操作;

  • 指数函数的加入导致化简后的最小单元变得复杂,从$coex^{index}$变为$coex^{index}*exp(Factor)$,toPoly()方法必然会递归地解析指数函数地指数部分,如何找到递归终点;

  • 如何实现表达式的化简。

自定义函数解析

这一步主要靠新建的FuncCall

这个类有两个功能。

首先,是建立自定义函数名与自定义函数表达式、自定义函数名与形参列表的一一映射关系。

然后根据调用parserFunc()后传入的自定义函数名与实参列表,得到自定义函数调用后产生的表达式字符串,再对这个字符串进行解析。

FuncCall

// 函数名 <-> 函数定义式
private static HashMap<String, String> functionDefine = new HashMap<>();
// 函数名 <-> 形参列表
private static HashMap<String, ArrayList<String>> parameters = new HashMap<>();

public static void addFunction(String input) {
    ...
    functionDefine.put(funcName, funcDefine);
    ...
    parameters.put(funcName, parameterMap);
}

public static Expr callFunction(FunctionFactor functionFactor) {
    String expression;
    ...
    return new Parser(new Lexer(expression)).parseExpr();
}

表达式展开

这里将最小单元Unit定为$coe*x^{index}*exp(Poly)$,因为PolyUnit集合,所以调用toPoly()时必然会有递归,这里将Poly == Zero作为递归终点。

表达式优化

在完成第二次作业时,采用了摆烂优化法,性能分并不高。

代码复杂度分析

代码规模
Source FileTotal LinesSource Code LinesSource Code Lines[%]Comment LinesComment Lines[%]Blank LinesBlank Lines[%]
Unit.java1611470.91300.0140.087
Token.java25200.810.0440.16
Term.java36320.88900.040.111
StringProcessing.java93810.87130.032390.0968
PowerFactor.java28240.85700.040.1429
Polynomial.java58510.87900.070.1207
Parser.java1241140.91900.0100.0806
NumFactor.java26220.84600.040.1538
Main.java21200.95200.010.0476
Lexer.java85780.91800.070.0824
FunctionFactor.java43340.79100.090.2093
FunctionCall.java44390.88620.045530.0682
Factor.java540.800.010.2
ExpressionFactor.java41360.87800.050.122
Expression.java27230.85200.040.1481
ExponentialFactor.java30260.86700.040.133
Constant.java44350.79500.090.205
Calculate.java91790.86820.022100.1099
代码复杂度
methodCogCev(G)iv(G)v(G)
Unit.Unit(Constant, BigInteger, Polynomial)0.01.01.01.0
Unit.toString()3.03.02.03.0
Unit.sameType(Unit)6.01.04.05.0
Unit.oneCoefficient()22.01.06.010.0
Unit.nomCoefficient()12.01.06.06.0
Unit.isFactor()6.04.08.09.0
Unit.getXIndex()0.01.01.01.0
Unit.getExpIndex()0.01.01.01.0
Unit.getCoefficient()0.01.01.01.0
Unit.expIndexToString()3.02.03.03.0
Unit.equals(Unit)6.01.05.06.0
Unit.clone()0.01.01.01.0
Unit.addCoefficient(Constant)0.01.01.01.0
Token.Token(Type, String)0.01.01.01.0
Token.getType()0.01.01.01.0
Token.getContent()0.01.01.01.0
Term.toString()3.01.03.03.0
Term.toPolynomial()1.01.02.02.0
Term.Term(int, ArrayList)0.01.01.01.0
StringProcessing.removeLeadingZero(String)8.05.04.06.0
StringProcessing.removeAllLeadingZero(String)2.01.03.03.0
StringProcessing.removeAdd(String)2.01.03.03.0
StringProcessing.pretreatment(String)0.01.01.01.0
StringProcessing.mergeAddSub(String)2.01.03.03.0
StringProcessing.merge(String)5.02.02.04.0
PowerFactor.toString()0.01.01.01.0
PowerFactor.toPolynomial()0.01.01.01.0
PowerFactor.PowerFactor(BigInteger)0.01.01.01.0
Polynomial.toString()2.02.02.03.0
Polynomial.Polynomial(ArrayList)0.01.01.01.0
Polynomial.isZero()3.03.02.03.0
Polynomial.getUnit(int)0.01.01.01.0
Polynomial.getSize()0.01.01.01.0
Polynomial.equals(Polynomial)9.06.03.06.0
Parser.parseTerm(int)2.01.03.03.0
Parser.Parser(Lexer)0.01.01.01.0
Parser.parseFunction()2.01.03.03.0
Parser.parseFactor()10.05.011.011.0
Parser.parseExpression()7.01.06.07.0
Parser.getPowerFactor()3.01.03.03.0
Parser.getNumFactor()4.01.02.03.0
Parser.getExpressionFactor()3.01.03.03.0
Parser.getExponentialFactor()0.01.01.01.0
NumFactor.toString()0.01.01.01.0
NumFactor.toPolynomial()1.02.02.02.0
NumFactor.NumFactor(BigInteger, int)0.01.01.01.0
Main.main(String[])1.01.02.02.0
Lexer.pre()1.02.02.02.0
Lexer.post()1.02.02.02.0
Lexer.now()0.01.01.01.0
Lexer.notEnd()0.01.01.01.0
Lexer.move()0.01.01.01.0
Lexer.Lexer(String)25.014.015.018.0
FunctionFactor.toString()0.01.01.01.0
FunctionFactor.toPolynomial()0.01.01.01.0
FunctionFactor.toExpression()0.01.01.01.0
FunctionFactor.newFunc()0.01.01.01.0
FunctionFactor.getFunctionName()0.01.01.01.0
FunctionFactor.getActualPara(int)0.01.01.01.0
FunctionFactor.FunctionFactor(String, ArrayList)0.01.01.01.0
FunctionCall.callFunction(FunctionFactor)8.04.05.05.0
FunctionCall.addFunction(String)4.01.05.05.0
ExpressionFactor.toString()0.01.01.01.0
ExpressionFactor.toPolynomial()1.01.02.02.0
ExpressionFactor.toIndexPolynomial()0.01.01.01.0
ExpressionFactor.ExpressionFactor(Expression, BigInteger)0.01.01.01.0
Expression.toString()1.01.02.02.0
Expression.toPolynomial()1.01.02.02.0
Expression.Expression(ArrayList)0.01.01.01.0
ExponentialFactor.toString()0.01.01.01.0
ExponentialFactor.toPolynomial()0.01.01.01.0
ExponentialFactor.ExponentialFactor(ExpressionFactor)0.01.01.01.0
Constant.toString()2.01.02.02.0
Constant.getValue()0.01.01.01.0
Constant.getSign()0.01.01.01.0
Constant.equalZero()0.01.01.01.0
Constant.equals(Constant)1.01.02.02.0
Constant.equalOne()0.01.01.01.0
Constant.Constant(int, BigInteger)0.01.01.01.0
Calculate.Zero()0.01.01.01.0
Calculate.One(int)0.01.01.01.0
Calculate.mulUnit(Unit, Unit)0.01.01.01.0
Calculate.mulPolynomial(Polynomial, Polynomial)5.02.04.05.0
Calculate.mulConstant(Constant, Constant)0.01.01.01.0
Calculate.addUnitToUnits(Unit, ArrayList)3.03.03.03.0
Calculate.addPolyToUnits(Polynomial, ArrayList)1.01.02.02.0
Calculate.addPolynomial(Polynomial, Polynomial)0.01.01.01.0
Calculate.addConstant(Constant, Constant)4.01.04.04.0
Total186.0133.0196.0219.0
Average2.1141.5112.2272.489
原因分析

这一次作业的代码复杂度原因与第一次一样,Lexer中大量的if...else...使得代码复杂度增大。

对于parseFactor()方法,这次进行了优化,分解成了多个方法,降低了复杂度

第三次作业

UML类图

img

代码架构分析

第三次加入了求导因子dx(Expr),并且让函数表达式可以嵌套定义。

难点总的来说就这两点,由于第二次采用的自定义函数解析方法能够实现函数表达式的嵌套定义,因此新增的相当于只有一个求导因子。

求导因子解析

核心解决思路为对Unit的求导:

Unit:$coex^{index}exp(Poly)$,Unit求导为$indexcoex^{index}exp(Poly) + coex^{index}*exp(Poly)*Poly.derive()$。

代码复杂度分析

代码规模

Source FileTotal LinesSource Code LinesSource Code Lines[%]Comment LinesComment Lines[%]Blank LinesBlank Lines[%]
Add.java51460.90200.050.098
Constant.java53430.81100.0100.1887
ConstantPoly.java30240.800.060.2
DeFactor.java29230.79300.060.207
ExpFactor.java44370.84100.070.159
Expression.java41340.82900.070.171
ExprFactor.java32250.78100.070.21875
Factor.java1170.63600.040.364
FuncCall.java47400.85120.04350.1064
FuncFactor.java39310.79500.080.205
Gcd.java16140.87500.020.125
Lexer.java91820.90100.090.099
Main.java27250.92600.020.0741
Mul.java34290.85300.050.1471
NumFactor.java35280.800.070.2
Parser.java1551420.91600.0130.084
Poly.java1331190.89500.0140.105
Powered.java16130.812500.030.1875
PowerFactor.java34270.79400.070.2059
StrProcess.java97840.86630.031100.1031
Term.java51440.86300.070.137
Token.java27210.77810.03750.1852
Unit.java1881690.89900.0190.1011

代码复杂度

methodCogCev(G)iv(G)v(G)
poly.Unit.Unit(Constant, BigInteger, Poly)0.01.01.01.0
poly.Unit.toString()3.03.02.03.0
poly.Unit.toPoly()0.01.01.01.0
poly.Unit.sameType(Unit)6.01.04.05.0
poly.Unit.oneCoe()22.01.06.010.0
poly.Unit.numCoe()12.01.06.06.0
poly.Unit.isFactor()6.04.08.09.0
poly.Unit.indexOfExpToString()3.02.03.03.0
poly.Unit.getNewUnit(BigInteger)0.01.01.01.0
poly.Unit.getIndexOfX()0.01.01.01.0
poly.Unit.getIndexOfExp()0.01.01.01.0
poly.Unit.getCoefficient()0.01.01.01.0
poly.Unit.equals(Unit)6.01.05.06.0
poly.Unit.derive()5.01.05.05.0
poly.Unit.clone()0.01.01.01.0
poly.Unit.addCoefficient(Constant)0.01.01.01.0
poly.Poly.toString()8.04.05.07.0
poly.Poly.size()0.01.01.01.0
poly.Poly.Poly(ArrayList)0.01.01.01.0
poly.Poly.getNewPoly(BigInteger)1.01.02.02.0
poly.Poly.getGcd()2.02.02.03.0
poly.Poly.get(int)0.01.01.01.0
poly.Poly.expToString()9.04.05.06.0
poly.Poly.equalZero()3.03.02.03.0
poly.Poly.equals(Poly)11.07.04.08.0
poly.Poly.derive()1.01.02.02.0
poly.Poly.clone()1.01.02.02.0
parser.Token.Token(Type, String)0.01.01.01.0
parser.Token.getType()0.01.01.01.0
parser.Token.getContent()0.01.01.01.0
parser.StrProcess.removeLeadingZero(String)8.05.04.06.0
parser.StrProcess.removeAllLeadingZero(String)2.01.03.03.0
parser.StrProcess.preProcess(String)0.01.01.01.0
parser.StrProcess.postProcess(String)2.01.03.03.0
parser.StrProcess.mergeAddSub(String)2.01.03.03.0
parser.StrProcess.merge(String)5.02.02.04.0
parser.Parser.parseTerm(int)2.01.03.03.0
parser.Parser.Parser(Lexer)0.01.01.01.0
parser.Parser.parseFactor()12.06.013.013.0
parser.Parser.parseExpression()7.01.06.07.0
parser.Parser.getPowerFactor()3.01.03.03.0
parser.Parser.getNumFactor()4.01.02.03.0
parser.Parser.getFuncFactor()2.01.03.03.0
parser.Parser.getExprFactor()3.01.03.03.0
parser.Parser.getExpFactor()3.01.03.03.0
parser.Parser.getDeFactor()0.01.01.01.0
parser.Lexer.pre()1.02.02.02.0
parser.Lexer.post()1.02.02.02.0
parser.Lexer.now()0.01.01.01.0
parser.Lexer.notEnd()0.01.01.01.0
parser.Lexer.move()0.01.01.01.0
parser.Lexer.Lexer(String)15.05.07.09.0
parser.Lexer.getType(char)13.012.01.014.0
Main.main(String[])1.01.02.02.0
expr.Term.toString()3.01.03.03.0
expr.Term.toPoly()1.01.02.02.0
expr.Term.Term(int, ArrayList)0.01.01.01.0
expr.Term.clone()1.01.02.02.0
expr.factor.PowerFactor.toString()0.01.01.01.0
expr.factor.PowerFactor.toPoly()0.01.01.01.0
expr.factor.PowerFactor.PowerFactor(BigInteger)0.01.01.01.0
expr.factor.PowerFactor.clone()0.01.01.01.0
expr.factor.NumFactor.toString()0.01.01.01.0
expr.factor.NumFactor.toPoly()0.01.01.01.0
expr.factor.NumFactor.NumFactor(int, BigInteger)0.01.01.01.0
expr.factor.NumFactor.clone()0.01.01.01.0
expr.factor.FuncFactor.toString()0.01.01.01.0
expr.factor.FuncFactor.toPoly()0.01.01.01.0
expr.factor.FuncFactor.FuncFactor(String, ArrayList)0.01.01.01.0
expr.factor.FuncFactor.FuncFactor(Expression)0.01.01.01.0
expr.factor.FuncFactor.clone()0.01.01.01.0
expr.factor.FuncCall.funcCall(String, ArrayList)8.04.05.05.0
expr.factor.FuncCall.addFunc(String)4.01.05.05.0
expr.factor.ExprFactor.toString()0.01.01.01.0
expr.factor.ExprFactor.toPoly()0.01.01.01.0
expr.factor.ExprFactor.ExprFactor(Expression, BigInteger)0.01.01.01.0
expr.factor.ExprFactor.clone()0.01.01.01.0
expr.factor.ExpFactor.toString()0.01.01.01.0
expr.factor.ExpFactor.toPoly()0.01.01.01.0
expr.factor.ExpFactor.ExpFactor(Factor, BigInteger)0.01.01.01.0
expr.factor.ExpFactor.clone()0.01.01.01.0
expr.factor.DeFactor.toString()0.01.01.01.0
expr.factor.DeFactor.toPoly()0.01.01.01.0
expr.factor.DeFactor.DeFactor(Expression)0.01.01.01.0
expr.factor.DeFactor.clone()0.01.01.01.0
expr.Expression.toString()1.01.02.02.0
expr.Expression.toPoly()1.01.02.02.0
expr.Expression.Expression(ArrayList)0.01.01.01.0
expr.Expression.clone()1.01.02.02.0
expr.Constant.toString()2.02.02.02.0
expr.Constant.getValue()0.01.01.01.0
expr.Constant.getSign()0.01.01.01.0
expr.Constant.equalZero()0.01.01.01.0
expr.Constant.equals(Constant)2.02.02.03.0
expr.Constant.equalOne(int)3.02.03.03.0
expr.Constant.Constant(int, BigInteger)0.01.01.01.0
expr.Constant.clone()0.01.01.01.0
calculate.Powered.polyPower(Poly, BigInteger)1.01.02.02.0
calculate.Mul.mulUnit(Unit, Unit)0.01.01.01.0
calculate.Mul.mulPoly(Poly, Poly)3.01.03.03.0
calculate.Mul.mulConstant(Constant, Constant)0.01.01.01.0
calculate.Gcd.gcd(BigInteger, BigInteger)1.01.02.02.0
calculate.ConstantPoly.Zero()0.01.01.01.0
calculate.ConstantPoly.One(int)0.01.01.01.0
calculate.ConstantPoly.constantZero()0.01.01.01.0
calculate.ConstantPoly.constantOne(int)0.01.01.01.0
calculate.Add.addUnitToUnits(Unit, ArrayList)3.03.03.03.0
calculate.Add.addPoly(Poly, Poly)2.01.03.03.0
calculate.Add.addConstant(Constant, Constant)4.01.04.04.0
Total226.0165.0233.0272.0
Average2.07341.51382.1382.495

原因分析

这次代码复杂度普遍较小,因为将较长的类与方法分解成了多个类或者方法。

架构设计体验

由于这次使用的递归下降解析方法足够优秀,使得不用大规模重构。每次只有对个别类或者方法的优化解析。

首先,递归下降方法对于正则表达式有着更加优越的可扩展性,对于增加的任何因子都有很好的解决方法。

其次,第二次作业采用的自定义函数调用方法已经很好地解决了嵌套定义的问题。

可扩展性

假如新的一次迭代为加入x的赋值x = C,求算出表达式的值。

扩展十分简单,就是预处理部分,将输入的字符串中的x替换为(C),只是要小心exp中的x

Bug分析

自己的bug

出现bug的地方为第二次作业,共有两个类型的bug。

  • 自定义函数调用中产生的表达式字符串没有加上括号,导致展开自定义函数时会产生错误。
  • 对于exp(Poly),若Poly为因子,则可以少一对括号,但判断因子的方法出现了错误,会将-x判断为因子,输出exp(-x),为错误输出。

这两个bug不是设计上的问题,是代码细节上的问题。且这与方法的复杂度没什么必然联系。

发现别人的bug

  1. 写测评机,用数量弥补质量,这种方法感觉是正统,测评机发现bug后,只需将与bug无关的部分减去,再调试一下就能很好的找到bug所在;
  2. 尝试特殊数据,如x-x1-10-0

优化分析

我做的优化主要是将冗余的方法或类进行解耦,降低方法复杂度。

结果优化

这次作业优化的点在于结果的长度,这一方面的优化主要在Unit.toString()中进行优化的。

特殊情况有coe = 0coe = 1index = 0index = 1exp(0)

再者当indexOfExp中各项的系数可以提出公因子,长度可以再减少。

这些优化注定会增加代码的复杂度,想办法解耦新增的优化代码,可以减少复杂度的减少。

心得体会

  • 在平时就要关注代码复杂度,一个地方的代码复杂度越高,出现优化与bug的概率就越高。
  • 优化时要保证正确性,结果错误得不偿失。
  • 采用扩展性优秀的方法可以大大降低之后迭代时的工作量。

未来方向

  • 可以减少exp(Factor)这种长度减小比较玄学事物的出现。
  • 这次作业中两次迭代难度差距有点大,可以相对平衡,如一次新增自定义函数与求导因子,一次增加指数函数。
  • 更加注重正确性,降低性能分的占比,比如这次exp()的化简就比较玄学,在这上面花时间有点得不偿失。
...全文
135 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧