2016-06-25 2 views
0

У меня есть функция с именем generateList и concat, как показано ниже. Это, по существу, конкатенации списков, возвращаемые generateList с я, начиная с 24 и заканчивая 1Объединение нескольких списков в Scala

def concat(i: Int, l: List[(String, Int)]) : List[(String, Int)] = { 
      if (i==1) l else l ::: concat(i-1, generateList(signs, i)) 
} 
val all = concat(23, generateList(signs, 24)) 

я могу преобразовать это в хвостовой рекурсии. Но мне любопытно, есть ли способ сделать это?

ответ

1

Существует множество способов сделать это с помощью встроенных методов Scala, доступных для списков.

Вот один подход, который использует foldRight

(1 to 24).foldRight(List[Int]())((i, l) => l ::: generateList(i)) 

Начиная с диапазоном Интс вы используете, чтобы строить отдельные списки, это concats результат generateList (I) к исходному пустому списку.

0

Вот один из способов сделать это:

val signs = "" 
def generateList(s: String, n: Int) = n :: n * 2 :: Nil 


scala> (24 to 1 by -1) flatMap (generateList(signs, _)) 
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(24, 48, 23, 46, 22, 44, 21, 42, 20, 40, 19, 38, 18, 36, 17, 34, 16, 32, 15, 30, 14, 28, 13, 26, 12, 24, 11, 22, 10, 20, 9, 18, 8, 16, 7, 14, 6, 12, 5, 10, 4, 8, 3, 6, 2, 4, 1, 2) 

То, что вы хотите сделать, это отобразить список с x => generateList(signs, x) функции, а затем сцепить результаты, то есть придавить список. Это именно то, что делает flatMap.

Смежные вопросы