2015-09-26 55 views
-1

我想问一个关于如何处理因变量的问题。从属变量循环C#

C1=MA(X,10) 
C2=MA(C1,10) 
C3=C2.Minus(C1) 
C4=MA(C3,10) 
Final=C4.Minus(C3) 

举例说明:最终= C4.Minus(C3),我保存它的两个参数C4,C3。

C4(MA ok and firstTime in MA)--> C3(MA NotOK,not fstTime)---> C2(MA ok)--->C1(MA ok) 
         0-------------------> 10--------------> 10+10---->10+10+10=30 

我创建了一个类,在第一个拿到每一行的所有PVC门

public class IndicatorInform 
    { 
     char[] parenthesis = new []{'(',')'}; 
     char[] equal = new char[] { '=' }; 
     char[] comma = new char[] { ';' }; 
     char[] all = new char [] { '.','<'}; 


     string text=null; 
     string funcname=null; 
     string[] args=null; 

     public void IndicatorInform (string expression, out string text,out string funcName,out string [] args) 
     { 
      string [] parts= expression.Split(equal); 
      text = parts[0]; 
      if(parts[1].Contains(";")) 
      { 
       string[] subparts = parts[1].Split(parenthesis); 
       funcname = subparts[0]; 
       args = subparts[1].Split(comma); 
       if(args.Count.equal(2)) 
       { 
        funcarg = args[0]; 
        period = Convert.ToDouble(args[1]); 
       } 
      } 
      else 
      { 
       if (parts[1].Contains("Plus")) 
        funcname = "Plus"; 
       if (parts[1].Contains("Minus")) 
        funcname = "Minus"; 
       if (parts[1].Contains("Multi")) 
        funcname = "Multi"; 
       if (parts[1].Contains("Div")) 
        funcname = "Div"; 
       parts[1] = parts[1].Replace(funcname, ""); 
       args=parts[1].Split(all); 
      } 
     } 
     public double Shifts {get; set;} 
     public double period { get; set; } 
     public string Funcname { get; set; } 
     public string text { get; set; } 
     public string funcarg { get; set; } 
    } 

然后我创建了一个Dictonary,并开始应对因变量

Dictionary<string,SubIndicator> Dico=new Dictionary<string,SubIndicator> ; 
     foreach (var line in richTextBox1.Lines) 
     { 
      SubIndicator SubInc = new SubIndicator(); 
      Dico.Add(SubInc.text,SubInc); 
     } 
     int incre=0; 
     double tempvalue=0; 
     foreach(string element in Dico.Keys) 
     { 
      string[] tempo=null; 
      if(Dico[element].text.Contains("Final")) 
      { 
       tempo=Dico[element].args; 
      } 
      else 
      { 
       if(tempo.Contains(Dico[element].text)) 
       { 
        if(Dico[element].Funcname.Contains("MA")) 
        { 
         if (incre.Equals(0)) 
         {tempvalue=Dico[element].period; 
         incre++;} 
         else 
         { 
          Dico[element].Shifts=tempvalue+Dico[element].period; 
          tempvalue =Dico[element].Shifts; 
         } 
        } 
        else 
        { 
         Dico[element].Shifts=tempvalue; 
        } 
       } 
      } 

我的算法适用于上述情况。但如何处理更复杂的情况如

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) 
C6(fst Time)---->C4--->C2   C5(fst Time)--->C3--> C1 
      0-->10+10-->10+10+20    0--> 15+5-->15+5+10 

感谢您的帮助。

+0

我不明白第一个和第二个例子有什么区别。你可以进一步解释。通常这些类型的问题需要递归算法来处理更复杂的输入。 – jdweng

+0

@ jdweng第一种情况,每行依赖于前一行'C4 - > C3 ---> C2 ---> C1',而不是第二行。我的算法不够智能,只能逐行处理。 –

+0

你说得对。递归算法是更好的解决方案,你能否进一步解释?谢谢 –

回答

0

我想我需要写一个更长的答案。数学函数需要有一个元素/节点的二叉树,它是一个包含左节点,右节点,值和数学运算符的类。该元素通常是一个类对象,可以是字典中的值。叶子节点将包含值,而非叶子节点将具有左节点,右节点或左右节点的运算符。

数学函数是相关联的,所以任何函数都可以分成左和右分量,如a = b +(c + d + e + f)。 b是左侧分量,(c + d + e + f)是右侧分量。正确的组件可以进一步分为左侧和右侧。

您的代码需要两件。首先是将输入解析为元素。第二部分是计算结果。递归函数将执行计算。递归检查查看一个元素是否包含左侧和/或右侧节点,并一直调用递归函数,直到找到包含值的叶。然后移回堆叠的函数调用,用从左侧和右侧组件返回的值替换数学运算符。

+0

现在我有一个IndicatorInform类,它包含所有信息,如左节点,右节点,值和数学运算符。一本字典包含所有指标。我尝试了一个递归函数,但它不能像上面提到的那样完成工作,因为这个函数对于复杂的情况并不能很好地执行。 –

+0

如何保持调用递归函数,直到找到包含值的叶。然后移回堆叠的函数调用,用从左侧和右侧组件返回的值替换数学运算符。这是我不知道的部分。 –

+0

@BlancoDDP我刚刚在http://stackoverflow.com/questions/32806814/recursive-algorithm-to-handle-depend-variables/32810622#32810622上写下我的答案后发现了这个。如果你看看我的回答,这与jdweng所说的完全一样,解决这个问题的最好方法是构建一棵树并解决树。快速浏览一下,看看如何使用树来接近和解决一个表达式,并且你会理解jdweng的解释。 – JTY