我想问一个关于如何用递归算法处理因变量的问题。

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/

10-12 00:01