Конвертировать L oop рекурсивное решение задачи в Scala - PullRequest
1 голос
/ 13 февраля 2020

Я написал следующий метод inshuffle (работает отлично), который берет список и возвращает количество шагов для in-shuffle . Он использует два метода splitLists и shuffle, которые я уже написал, и обеспечит реализацию. Я хотел удалить l oop и хотел попробовать какое-то рекурсивное решение. Мне нужна помощь в этом отношении. Любая помощь будет высоко ценится. спасибо Вот реализация splitLists(ls, n)

def splitLists(list: List[Any], n: Int) = {
    if (n > list.length) {
      throw new Exception("N is greater than length of list")
    }
    else if (n == list.length) {
      List(list, List())
    }
    else {
      List(list.slice(0, n),
        list.slice(n, list.length))
    }
  }

А вот код для shuffle метода:

def shuffle(list1: List[Any], list2: List[Any]): List[Any] = {
    list1.zipAll(list2, "", "")
      .flatMap(_.productIterator.toList)
      .filter(_ != "")
  }

Вот метод **InShuffle**, который я хочу преобразовать l oop решение на основе рекурсии.

  def inshuffle(list1:List[Any]): Int ={
    var count = 1
    var list:List[Any] = list1
    val list_copy = list1

    var list_of_lists = splitLists(list, list.length/2)
    list = shuffle(list_of_lists(0), list_of_lists(1))

    while(!list.equals(list_copy)){
      list_of_lists = splitLists(list, list.length/2)
      list = shuffle(list_of_lists(0), list_of_lists(1))
      count += 1
    }
  count
  }


Пояснение

Если я передаю список [1,2,3,4] Следующие взаимодействия while l oop

Пропущен ввод = [1,2,3,4]
Iteration 1: SplitLists возвращает [[1,2],[3,4]], а затем этот список списков передается в случайном порядке, который возвращает [1,3,2,4] (Альтернативное перемешивание списков)

Input Passed = [1,3,2,4]
Iteration 2: SplitLists возвращает [[1,3],[2,4]], а затем этот список списков передается в случайное перемешивание, которое возвращает [1,2,3,4] ( Альтернативное перемешивание списков)

1 Ответ

0 голосов
/ 13 февраля 2020

Старайтесь не использовать var, если это возможно.

Я мог бы найти следующее рекурсивное решение. Пожалуйста, исправьте меня, если я понял это неправильно.

@scala.annotation.tailrec
  def inShuffleRec(list: List[Any], count: Int = 1): Int = {
    val (left, right) = list.splitAt(list.size/2)
    val shuffled = shuffle(left, right)

    if (list.equals(shuffled))
      count
    else
      inShuffleRec(shuffled, count + 1)
  }

ПРИМЕЧАНИЕ. Ваше решение переходит в бесконечное число l oop для списка ввода с пустой строкой. Например, попробуйте запустить его с помощью ввода List("", 1, 2.0)

...