我编写了以下方法inshuffle
(工作得很好),该方法获取一个列表并返回in-shuffle的步数。它使用了两种方法splitLists
和shuffle
,它们已经写好了,并将提供实现。我想删除循环并想尝试一些递归解决方案。在这方面,我需要一些帮助。任何帮助都感激不尽。谢谢
这是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**
方法,我想将基于循环的解决方案转换为基于递归的解决方案。
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
循环
已通过输入= [1,2,3,4]
Iteration 1:
SplitLists
返回[[1,2],[3,4]]
,然后将此列表列表传递给shuffle,后者返回[1,3,2,4]
(列表的另一种shuffle)
已通过输入= [1,3,2,4]
Iteration 2:
SplitLists
返回[[1,3],[2,4]]
,然后将此列表列表传递给shuffle,后者返回[1,2,3,4]
(列表的另一种shuffle)
答案 0 :(得分:0)
请尽量不要使用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)
}
注意:您的解决方案进入一个包含空字符串的输入列表的无限循环。例如尝试使用输入List("", 1, 2.0)