gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:21:53 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com