Как написать функцию, которая печатает все возможные строки из данной строки? - PullRequest
0 голосов
/ 20 февраля 2011

Я пытаюсь написать код, который делает следующее: 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)
  }
}

Подскажите, пожалуйста, где моя ошибка?

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 20 февраля 2011
scala> "abc".permutations.toList
res1: List[String] = List(abc, acb, bac, bca, cab, cba)

Хотя я бы этого не включил.

2 голосов
/ 20 февраля 2011

действительно очевидная ошибка в том, что все ваши имена перепутаны.

Я вижу инициализацию new_array, но затем вы пытаетесь использовать new_string, который, похоже, никуда не приходит.

1 голос
/ 20 февраля 2011

Одна очевидная вещь заключается в том, что вы пытаетесь поменять две буквы, но вы ошиблись в заказе. Должно быть

val letter = new_array(n)
new_array(n) = new_array(n-1)
new_array(n-1) = letter

Могут быть и другие ошибки, но так как это домашняя работа ...

0 голосов
/ 21 февраля 2011

Вы хотите написать функцию next_permutation, операцию которой можно суммировать следующим образом: найдите самый длинный суффикс массива в порядке убывания - скажем, он начинается с индекса m. Выясните, где значение индекса m-1 принадлежит этому суффиксу, и поменяйте местами два значения. Затем измените суффикс от m до конца списка, чтобы он был в отсортированном порядке.

0 голосов
/ 21 февраля 2011

Как уже говорилось, это проблема перестановки.В 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)

(хотя я не уверен, что моя перестановка является оптимальной. По крайней мере, выход на пенсию может бытьхвост рекурсивный)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...