使用元组从递归函数中提取数据



我有一个 Scala 函数,它在其生命周期中执行 2-3 次递归调用。我想将变量保存在列表中的第二个元组中。有没有聪明的方法可以做到这一点?

只是传递变量意味着我将有一个列表[字符串],而实际上我想要的是一个列表[列表[字符串]]。

函数内部是否需要一个随每次迭代更新的变量?

def someRecursiveFunction(listOfWords:List[String])List[List[String]] = {
val textSplitter = listOfWords.lastIndexOf("Some Word")
if (Some Word != -1) {
val someTuple = listofWords.splitAt(textSplitter)
val valueIwant = someTuple._2
someRecursiveFunction(someTuple._1)
}
List(someTuple._2,someTuple._2(1),someTuple._2(2)) // What I want back
}

有没有办法从递归函数中提取第二个元组,以便我可以在我的程序中进一步使用它?

如果返回类型固定为List[List[String]],则进行以下更改 到代码:

  1. 因为someType._2是作为someType._2(2)访问的,所以至少应该有3列表中的字符串someType._2
  2. 最后一个表达式必须是返回类型,即List[List[String]]。因为someType._2(1)someType._2(2)只是字符串而不是List[String]List(someTuple._2,List(someTuple._2(1),someTuple._2(2)))将是返回类型List[List[String]]

  3. "Some Word"的值将在递归过程中适当注意someTuple._2.size总是>=3.

  4. 由于我们需要访问someType._2并且每次递归期间它都会发生变化, 它在递归函数中声明为var

    根据从您的要求中得出的这种理解,以下代码可能是 您在寻找什么:

    def someRecursiveFunction(listOfWords:List[String],sw: String):List[List[String]] = {
    val textSplitter = listOfWords.lastIndexOf(sw)
    var i =0
    if(i==0) { var someTuple:(List[String],List[String]) = (List(),List()) }
    if (textSplitter != -1 && listOfWords.size-3>=textSplitter) {
    someTuple = listOfWords.splitAt(textSplitter)
    println(someTuple._1,someTuple._2)  // for checking recursion
    if( someTuple._1.size>=3){ i+=1
    someRecursiveFunction(someTuple._1,someTuple._1(textSplitter-3))}
    }          
    List(someTuple._2,List(someTuple._2(1),someTuple._2(2))) // What I want back
    }
    

在 Scala REPL 中:

val list = List("a","b","c","x","y","z","k","j","g","Some Word","d","e","f","u","m","p")

scala> val list = List("a","b","c","x","y","z","k","j","g","Some Word","d","e","f","u","m","p")
list: List[String] = List(a, b, c, x, y, z, k, j, g, Some Word, d, e, f, u, m, p)
scala> someRecursiveFunction(list,"d")
(List(a, b, c, x, y, z, k, j, g, Some Word),List(d, e, f, u, m, p))
(List(a, b, c, x, y, z, k),List(j, g, Some Word))
(List(a, b, c, x),List(y, z, k))
(List(a),List(b, c, x))
res70: List[List[String]] = List(List(b, c, x), List(c, x))
scala> someRecursiveFunction(list,"Some Word")
(List(a, b, c, x, y, z, k, j, g),List(Some Word, d, e, f, u, m, p))
(List(a, b, c, x, y, z),List(k, j, g))
(List(a, b, c),List(x, y, z))
(List(),List(a, b, c))
res71: List[List[String]] = List(List(a, b, c), List(b, c))

最新更新