我想请教一个关于如何用递归算法处理因变量的问题。
C1=MA(X,10)
C2=MA(C1,10)
C3=C2.Minus(C1)
C4=MA(C3,10)
Final=C4.Minus(C3)
//Dependence:C4--> C3---> C2--->C1
在这个例子中,我从最后一行开始。我的递归算法是逐行读取以查找其因变量是否在上一行。
但是如果我有更复杂的情况
C1=MA(X,10)
C2=MA(X,20)
C3=MA(C1,5)
C4=MA(C2,10)
C5=MA(C3,15)
C6=MA(C4,10)
Final=C6.Minus(C5)
//Dependence: C6---->C4--->C2 C5--->C3--> C1
读取每一行来找到它的因变量是行不通的。我的问题是是否有更好的方法来找到它的因变量?
如果您有一些想法可以与我分享,非常感谢。 PS. 详细代码在这里Dependent Variable Loop C# .
最佳答案
以下是我个人如何从头到尾实现这个问题的解决方案。
它将构建一个“操作树”,其中包含一个您可以调用的递归方法 Solve()
。
我编写它是为了使用一个接口(interface),用于硬值或“引用”另一个表达式。
这假设所有操作只有 2 个输入。
public interface IExpression {
public int Solve();
}
// class that will contain an integer number value
public class ValueExpression : IExpression {
public int Value { get; set; }
public ValueExpression(int value) {
Value = value;
}
public int Solve() {
return Value;
}
}
// class that will contain definition for expressions
public class OperationExpression : IExpression {
public IExpression Left { get; set; }
public IExpression Right { get; set; }
public Operations Operation { get; set; }
public OperationExpression() { }
public OperationExpression(IExpression left, IExpression right, Operations operation) {
Left = left;
Right = right;
Operation = operation;
}
public enum Operations {
MA,
Minus,
Add
// other
}
public int Solve() {
switch (Operation) {
case MA :
// You will have to implement MA method
return MA(left.Solve(), right.Solve());
case Minus :
return left.Solve().Minus(right.Solve());
case Add :
return left.Solve().Add(right.Solve());
}
}
}
现在你只需要找到一种方法让你的输入表达式变成上面的格式,最终看起来像一棵树。在您的根上调用 Solve()
后,它将返回答案。
您还可以注意到,叶子最终将成为数值,而分支将成为操作。
当然现在的挑战是:
创建一种获取 IExpression 树格式输入的方法
错误处理(如果表达式不能 解决?除以 0,超过最大整数值,如果左/右 为空等)
以下是我将如何使用上述设置您的“复杂案例”示例:
int X = 0; // Your parameter I guess?
OperationExpression C1 = new OperationExpression(new ValueExpression(X),
new ValueExpression(10), OperationExpression.Operations.MA);
OperationExpression C2 = new OperationExpression(new ValueExpression(X),
new ValueExpression(20), OperationExpression.Operations.MA);
OperationExpression C3 = new OperationExpression(C1,
new ValueExpression(5), OperationExpression.Operations.MA);
OperationExpression C4 = new OperationExpression(C2,
new ValueExpression(10), OperationExpression.Operations.MA);
OperationExpression C5 = new OperationExpression(C3,
new ValueExpression(15), OperationExpression.Operations.MA);
OperationExpression C6 = new OperationExpression(C4
new ValueExpression(10), OperationExpression.Operations.MA);
OperationExpression Final = new OperationExpression(C6,
C5, OperationExpression.Operations.Minus);
var C1Result = C1.Solve();
var C2Result = C2.Solve();
var C3Result = C3.Solve();
// etc
关于c# - 处理因变量的递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806814/