随机生成有效的中缀算术表达式

问题描述:

对于我的程序,我需要生成具有可定制复杂性的有效中缀表达式。问题是,我无法找出一种方法来防止零除,浮点数答案和负数答案。随机生成有效的中缀算术表达式

为了防止负面答案,我采取了肮脏的做法。也就是说,产生一个表达式,对其进行评估,如果结果是阴性,产生again.Here有一些事情你应该知道:

  1. inToPost()是生成中缀表达式转换为后缀的方法评价。
  2. complexityLevel < = DIVIDE意味着我们不应该在表达式中放置括号。
  3. complexityLevel == ARITHMETIC_PARENTHESIS意味着包含括号。

我怎样才能确保一)有零B无师)没有分歧导致浮点(想出了一个肮脏的方式做到这一点)C)最终的结果是不负 下面是代码

public void generateRandom(int operandLimit, int operatorCount, int complexityLevel) { 
     Random rand = new Random(); 
     infix.clear(); 

     int i = 0; 
     infix.add(rand.nextInt(operandLimit) + 1); 

     while(i < operatorCount) { 
      int operator; 
      if(complexityLevel <= DIVIDE) 
       operator = rand.nextInt(complexityLevel - 1)*1000 + 1000; 
      else 
       operator = rand.nextInt(complexityLevel - 3)*1000 + 1000; 

      int operand = rand.nextInt(operandLimit) + 1; 

      if(operator == Operator.DIVIDE) { 
       int lastNum = infix.get(infix.size() - 1); 

       if(lastNum < operand) { 
        int temp = operand; 
        operand = lastNum; 
        lastNum = temp; 
       } 

       lastNum -= lastNum % operand; 
       infix.set(infix.size() - 1, lastNum); 
      } 

      infix.add(operator); 
      infix.add(operand); 

      ++i; 
     } 

     if(complexityLevel == ARITMETIC_PARENTHESIS) { 
      int braceOpen = rand.nextInt(operatorCount) * 2; 
      infix.add(braceOpen, Operator.BR_OPEN); 
      infix.add(braceOpen + 4, Operator.BR_CLOSE); 
     } 

     inToPost(); 
     if(evaluate() < 0) 
      generateRandom(operandLimit, operatorCount, complexityLevel); 
    } 

它看起来像你(b)和(c)中已经处理了您的条件。既然你的操作数从来没有0,我猜想唯一可能违反(a)的是,如果添加的圆括号碰巧覆盖了一个零值,并且之前的操作符是一个除法。你可以检查这种情况下,如果你修改了inToPost()采取子表达式:

if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
     evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) { 
    // Put parentheses elsewhere, or cancel 
} 
+0

我可以从内部改变经营者 - 为+这一点。谢谢:)对于C) – wirate 2012-03-23 18:01:02

+0

我真的不觉得我正在做正确的方式。一次又一次地生成表达式,直到+答案出来 – wirate 2012-03-23 18:01:53

+0

当我碰到这种具有复杂约束的情况时,我通常发现生成很多选项并过滤出符合约束条件的选项会导致比尝试更简洁的代码在约束内生成。 – 2012-03-23 18:06:40