我想问一个关于如何用递归算法处理因变量的问题。
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
阅读每一行来找到它的因变量是行不通的。我的问题是是否有更好的方法来找到它的因变量?
如果你有什么想法可以和我分享,非常感谢。
注:这里有详细的代码Dependent Variable Loop C#。
最佳答案
以下是我将如何从我的头顶亲自实现这个问题的解决方案。
它将构建一个“操作树”,其中包含一个可以调用的递归方法Solve()
。
我写它是为了使用一个接口,用于硬值或“引用”另一个表达式。
这假设所有操作只有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/