如何用递归创建java算术计算器

时间:2016-02-12 02:48:08

标签: java recursion

我需要创建一个java程序来评估输入文件中的表达式,并将结果返回到输出文件中。它需要考虑运算符优先级,一元和二元运算符,括号匹配,并且必须仅依赖递归(没有堆栈或队列)。

我整晚都在考虑这件事,这让我感到沮丧。我不是要求为我编写的整个java程序。我只需要一些指导。我从编写一些伪代码开始,但我认为它没有任何好处:

输入:从中读取每个表达式的文本文件。 输出:重复每个表达式的文本文件,以及打印结果。

Algorithm SecondCalc()
{
   input = “expressions.txt”;
   output = “out.txt”;
   if (input.currentLine has something)
   {
       line = input.currentLine;
       output.write(line);
       line = line.replace(“-space-”, “”);
       evaluate(line);
       //...to be continued
   }
}

Algorithm evaluate(line)
{
  for(i = 0 to line.length)
  {
     if(i == “(” or “)” ) exit loop;
     if(i == “!”) exit loop;
     if(i == “^”) exit loop;
     if(i == “*” or “/” ) exit loop;
     if(i == “+” or “-” ) exit loop;
     if(i == “>” or “>=” or “<” or “<=” ) exit loop;
     if(i == “==” or “!=” ) exit loop;
     if(i == “$”) exit loop;
 }

 temp1 = line from index 0 to i;
 temp2 = line from index i + 1 to line.length;
 if(i == “!”) then evaulate(temp1!);
 //...to be continued
}

任何提示将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

我建议阅读波兰表示法。它是存储数学函数的好方法。例如+ cos a b - &gt; cos(a)+ b而cos + a b - &gt; COS(A + B)。没有含糊之处。此外,右边的术语优先于左边的术语。

我很久以前就写过一个符号逻辑操纵器,读取字符串肯定很难。以下是我建议的流程:

  1. 查找任何括号外的二元运算符。从最高操作顺序开始,然后继续工作。
  2. 当您找到二元运算符时,递归调用二元运算符任一侧的参数上的stringtofunction。您正在查看的二元运算符与括号外的任何其他二元运算符之间或二进制运算符与字符串末尾之间的任何内容都计为1个对象。
  3. 从第二部分返回的内容类似于操作符return1以波兰表示法返回。
  4. 当琴弦的最外侧是括号时,将它们剥离。
  5. 如果您没有找到任何顶级二元运算符搜索一元运算符。递归调用一元运算符的参数并将其存储为operator return;

答案 1 :(得分:0)

我注意到的第一件事就是你说想要运算符优先级,但是在你的evaluate中你忽略了运算符优先级,实际上先执行先到先服务,它们使用相同的优先级来处理它们。如果您的目标确实是模拟运算符优先级(我假设输入看起来像java的表达式)那么我建议您在处理其他运算符之前先正确处理某些运算符,或者正确地重新排列输入匹配其他样式,如波兰表示法。

对于这两种情况,我会做一个类似的过程:而不是像你现在那样在for循环中的if语句后面的if语句,尝试for循环后循环,其中每个for循环查找特定的运算符和&#34;做某事&#34;。

for(i = 0 to line.length)
{
    if(i == “(” or “)” ) doSomething;
}
for(i = 0 to line.length)
{
    if(i == “!” ) doSomething;
}
for(i = 0 to line.length)
{
    if(i == “^”) doSomething;
}
for(i = 0 to line.length)
{
    if(i == “*” or “/” ) doSomething;
}
for(i = 0 to line.length)
{
    if(i == “+” or “-” ) doSomething;
}
for(i = 0 to line.length)
{
    if(i == “>” or “>=” or “<” or “<=” ) doSomething;
}
for(i = 0 to line.length)
{
    if(i == “==” or “!=” )doSomething;
}
for(i = 0 to line.length)
{
    if(i == “$”)doSomething;
}

}

有很多需要改进的地方,但希望这能指出你正确的方向。