Извлечение данных из рекурсивной функции с использованием кортежей - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть функция 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 голосов
/ 25 сентября 2018

Если тип возвращаемого значения установлен на 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))
...