Scala中的转换循环问题递归解决方案

问题描述 投票:1回答:1

我编写了以下方法inshuffle(工作得很好),该方法接受一个列表并返回in-shuffle的步数。它使用了我已经编写并提供实现的两种方法splitListsshuffle。我想删除循环并想尝试一些递归解决方案。在这方面,我需要一些帮助。任何帮助都感激不尽。谢谢这是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)]

scala recursion while-loop tail-recursion
1个回答
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)

运行它
© www.soinside.com 2019 - 2024. All rights reserved.