递归创建scala中字符串的所有旋转

递归创建scala中字符串的所有旋转,scala,recursion,burrows-wheeler-transform,Scala,Recursion,Burrows Wheeler Transform,我一直在尝试重新创建Burrows-Wheeler变换的示例。为了增加乐趣,我尝试通过递归策略来实现。然而,在第一步中,我被卡住了,创建了字符串的所有旋转。这是我的密码: object SimpleBW extends App { val string = "^BANANA|" val list = tranformStringStart(string) list.foreach(println) def tranformStringStart(string: String

我一直在尝试重新创建Burrows-Wheeler变换的示例。为了增加乐趣,我尝试通过递归策略来实现。然而,在第一步中,我被卡住了,创建了字符串的所有旋转。这是我的密码:

object SimpleBW extends App {

  val string = "^BANANA|"

  val list = tranformStringStart(string)
  list.foreach(println)

  def tranformStringStart(string: String): List[String] = { transformString(string, string.length) }

  def transformString(string: String, splitIndex: Int): List[String] = {
    if (splitIndex == 0) {
      // Recursion base case
      Nil
    } else {
      val (firstString, secondString) = string.splitAt(splitIndex)
      val newString = secondString + firstString
      newString :: transformString(secondString + firstString, splitIndex - 1)
    }
  }

}
这将生成以下输出:

^BANANA|
|^BANANA
NA|^BANA
ANANA|^B
A|^BANAN
BANANA|^
NANA|^BA
ANA|^BAN
这与维基百科的例子相似,但不完全相同,我似乎不明白为什么。根据示例,输出应如下所示:

^BANANA|
|^BANANA
A|^BANAN
NA|^BANA
ANA|^BAN
NANA|^BA
ANANA|^B
BANANA|^

我已经盯着它看了一段时间了,虽然问题应该是相当直接的,但我似乎无法解决它。你能指出我做错了什么吗?

当你将拆分索引向前移动一个字符时,你必须将其应用于原始字符串:

newString :: transformString(string, splitIndex - 1)

另一种解决方案是删除拆分索引参数并始终拆分最后一个字符,但随后必须将其再次应用于转换后的字符串。

这里有一个较短的函数,它不使用递归,但在计算中也使用相同的方法

def transformString(s:String):List[String] = 
  for(i <- s.length until 0 by - 1 toList) yield s.drop(i)+ s.take(i)
def transformString(s:String):List[String] = s.inits.toList zip(s.tails.toSeq.reverse) map(z=> z._2+z._1)