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

时间:2019-05-02 15:45:12

标签: scala tail-recursion

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

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 个答案:

答案 0 :(得分:3)

s.head永远不会为null。如果字符串为空(或者为null,则绝不应该-null应该永远不会真正出现在scala代码中),它将引发异常。 另外,您返回的时间还太早-x.tail.isEmpty表示您还需要处理一个字符。 最后,您总是返回""而不是实际结果。

类似的事情应该起作用:

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

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