scala string Хвостовая рекурсия с сопоставлением с образцом - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь написать функцию хвостовой рекурсии для обращения строки, вот код, по какой-то причине я не уверен, что условие соответствия шаблона препятствует получению обращенной строки как вывода

def revstring(str:String):String={
  @tailrec
  def rev(str:String,r:String):String={ 
    str match{
      case s if s.head==null =>null
      case x if x.tail.isEmpty => ""
      case _=> rev(str.tail, str.head +r) 
    }
  }
  rev(str,"")}println(revstring("Mississipi"))
}

1 Ответ

3 голосов
/ 02 мая 2019

s.head никогда не равно нулю.Он выдаст исключение, если строка пуста (или если она пустая, которой она никогда не должна быть - нуля никогда не должна появляться в scala-коде).Кроме того, вы возвращаетесь слишком рано - x.tail.isEmpty означает, что у вас еще есть один символ для обработки.Наконец, вы всегда возвращаете "" вместо фактического результата.

Примерно так должно работать:

  str match {
     case "" => r
     case s => rev(s.tail, s.head + r)
  }

Как уже упоминалось в комментарии, манипулирование строками, подобными этому, не очень производительно.Таким образом, в реальной жизни вы, вероятно, захотите преобразовать его в список, перевернуть список, а затем .mkstring, чтобы собрать его обратно.

...