Как сделать обратную польскую запись в Scala с помощью рекурсии? - PullRequest
0 голосов
/ 29 марта 2019

Я пытался сделать RPN в Scala, но я получил исключение в консоли

Исключение в потоке "main" scala.MatchError: 1 (из класса java.lang.Character)

и я останавливаюсь здесь, потому что Intelij не показывает, где проблема. Я думаю, что я неправильно делаю

if (!expr.isEmpty) {
  expr.head match 

но я провожу несколько часов, думая, как это обменять, и ничего не изобретаю

я делаю эту программу на Java, но в функциональном программировании я не знаю, как правильно использовать это совпадение с хвостом Рекурсивно


object RPN extends App {

  print(evaluate("123++"))
 def evaluate( expr : String)  {
   val stack =  Stack[Double]()

   var  a,b  :Int=0
   @tailrec
def helper ( asset : String){

if (!expr.isEmpty) {
  expr.head match {
    case it if 0 until 9 contains it => stack.push(expr.head); helper(asset.tail)
    case '+' => b = stack.pop.toString().toInt; a = stack.pop.toString().toInt; stack.push(a + b)
    case '-' => b = stack.pop.toString().toInt; a = stack.pop.toString().toInt; stack.push(a - b)
    case '*' => b = stack.pop.toString().toInt; a = stack.pop.toString().toInt; stack.push(a * b)
    case '/' => b = stack.pop.toString().toInt; a = stack.pop.toString().toInt; stack.push(a / b)
  }
}
else return stack.pop
    }
   helper(expr)

}
}

1 Ответ

2 голосов
/ 29 марта 2019

Ваш код ссылается на expr внутри helper(), где вы, вероятно, хотите ссылаться на asset.

Кроме того, вам не нужны return или var s..

def evaluate(expr :String) :Double = {
  val stack = collection.mutable.Stack[Double]()

  @annotation.tailrec
  def helper(asset :String) :Double =
    if (asset.isEmpty) stack.pop
    else {
      asset.head match {
        case c if c.isDigit => 
                    stack.push(c.asDigit)
        case '+' => stack.push(stack.pop + stack.pop)
        case '-' => stack.push(-stack.pop + stack.pop)
        case '*' => stack.push(stack.pop * stack.pop)
        case '/' => stack.push(1/stack.pop * stack.pop)
        case  c  => throw new Error(s"Bad Char: $c")
      }
      helper(asset.tail)
    }

  helper(expr)
}

тестирование:

evaluate("123++")  //res0: Double = 6.0
evaluate("954--")  //res1: Double = 8.0
evaluate("423*+")  //res2: Double = 10.0
evaluate("28/")    //res3: Double = 0.25
evaluate("73/")    //res4: Double = 2.333333333333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...