Я написал следующий метод 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]
( Альтернативное перемешивание списков)