【问题标题】:Extracting data out of a recursive function using tuples使用元组从递归函数中提取数据
【发布时间】:2019-02-27 05:05:45
【问题描述】:

我有一个 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
}

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

【问题讨论】:

  • 嗨@Asilux,你能让你的问题更简洁吗? - 我不确定你想要什么以及有什么问题。另外,您能否提供一个示例输入和预期输出?

标签: scala recursion functional-programming tuples


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 2018-08-21
    • 2014-08-21
    • 2012-10-12
    • 2016-01-28
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多