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

时间:2018-09-23 13:29:06

标签: scala recursion functional-programming tuples

我有一个Scala函数,该函数在其生命周期内进行2-3次递归调用。我想将变量保存在列表中的第二个元组中。有什么聪明的方法吗?

仅传递变量将意味着我将拥有一个List [String],而实际上我想要的是List [List [String]]。

在函数内部是否需要一个随每个信号更新的变量?

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
}

是否有一种方法可以从递归函数中提取第二个元组,以便在程序中进一步使用它?

1 个答案:

答案 0 :(得分:0)

如果返回类型固定为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))