带有模式匹配的scala字符串尾递归

scala string Tail recursion with pattern match

我正在尝试编写一个尾递归函数来反转字符串,这是代码,出于某些原因我不确定模式匹配条件是否阻止它获取反转字符串作为输出

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"))
}

s.head 永远不会为空。如果字符串为空(或者如果它为 null,它 永远不会 - null 永远不应该真正出现在 scala 代码中),它将抛出异常。 此外,您 return 太早了 - x.tail.isEmpty 意味着您还有一个字符需要处理。 最后,你总是 return "" 而不是实际结果。

像这样的东西应该可以工作:

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

如评论中所述,像这样操作字符串的性能不是很好。因此,在现实生活中,您可能希望将其转换为列表,反转列表,然后 .mkstring 将其放回原处。

我创建了使用 scala 的尾递归反转字符串的函数

def reverseString(str:String) = {
@tailrec
def reverseStringHelper(strTail:List[Char],reversedString :List[Char]):List[Char] = {
  strTail match {
    case Nil => reversedString
    case head :: tail => {
      reverseStringHelper(tail,head :: reversedString)
    }
  }
}
reverseStringHelper(str.toList,List[Char]()).mkString
}

如果您觉得回答有帮助,请采纳。

Github要点:https://gist.github.com/Deepak-nebhwani/0f0981027b61ff9f50904662614e7b7f