c# - 处理因变量的递归算法

标签 c# algorithm recursion

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

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() 后,它将返回答案。

您还可以注意到,叶子最终将成为数值,而分支将成为操作。

当然现在的挑战是:

  1. 创建一种获取 IExpression 树格式输入的方法

  2. 错误处理(如果表达式不能 解决?除以 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/

相关文章:

algorithm - 具有动态项目优先级的优先级队列

python - 递归查找混合类型元组中的最大值

c# - ForEach TreeNode.Nodes 取出空节点

c# - 向 WCF RequestSecurityToken 消息添加 header

c++ - 在 C++ 中查找重复文件的最佳方法是什么?

c# - Newtonsoft JSON 反序列化使用 HttpWebResponse

algorithm - 图论 - 循环长度无向图 - 邻接矩阵

python - 递归数组的每个元素

c# - C# 中的 Selenium 框架

c# - 如何为 'float method' 返回 null - 错误处理