我正在尝试编写执行以下操作的代码: 1.有一个字符串“abc” 2.it打印出所有可能的字符串:abc,bac,cba,acb,cab,bca
以下是我编写的代码,但它始终出错:
def swap(n: Int, source: String): String = {
val new_array = source.toCharArray
if (n == 1) {
new_string
} else {
var letter = new_array(n)
letter = new_array(n-1)
new_array(n-1) = letter
var k = new String(new_array)
swap(n, source)
}
}
你能告诉我我的错误在哪里吗?
提前谢谢。
答案 0 :(得分:3)
scala> "abc".permutations.toList
res1: List[String] = List(abc, acb, bac, bca, cab, cba)
我不会转过那个。
答案 1 :(得分:2)
非常明显的错误是你的名字全部混淆了。
我可以看到new_array
已初始化,但之后您尝试使用new_string
,这似乎不是来自任何地方。
答案 2 :(得分:1)
一个显而易见的事情是你试图交换两个字母,但你的订单错了。它应该是
val letter = new_array(n)
new_array(n) = new_array(n-1)
new_array(n-1) = letter
可能还有其他错误,但因为这是家庭作业......
答案 3 :(得分:0)
如前所述,这是一个排列问题。使用Scala 2.8,您可以编写类似的内容:
def permut[T](l: List[T]): List[List[T]] = {
def retire(e: T, l: List[T]): List[T] = l match {
case Nil => Nil
case x::xs if e == x => xs
case x::xs => x::retire(e, xs)
}
l match {
case Nil => List(Nil)
case _ => for ( x <- l; p <- permut(retire(x, l))) yield (x :: p)
}
}
然后:
scala> permut("abc" toList) map {_.mkString }
res11: List[String] = List(abc, acb, bac, bca, cab, cba)
(我不确定我的排列是否是最优的。至少,退休可能是尾递归的)
答案 4 :(得分:0)
您想要编写一个next_permutation
函数,其操作可以总结如下:查找数组的最长后缀,按降序排列 - 假设它从索引m开始。找出索引m-1的值在该后缀中的位置,并交换这两个值。然后将后缀从m反转到列表的末尾,以便按顺序排列。