2016-06-25 7 views
0

Ich habe eine Funktion namens GenerateList und Concat-Funktion wie folgt. Es ist im Wesentlichen Listen durch die generateList zurück verketten mit i bei 24 und endend bei 1Verketten mehrerer Listen in 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)) 

ich das Schwanz Rekursion umwandeln kann. Aber ich bin neugierig, ob es eine skalare Möglichkeit gibt, dies zu tun?

Antwort

1

Es gibt viele Möglichkeiten, dies mit den eingebauten Scala-Methoden für Listen zu tun.

Hier ist ein Ansatz, der foldRight

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

Beginnend mit dem Bereich von Ints Sie separate Listen erstellen verwenden verwendet, ist es das Ergebnis generateList (i) concats in die Anfangs leere Liste.

0

Dies ist ein Weg, dies zu tun:

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) 

Was Sie wollen, ist zu tun, um die Liste mit x => generateList(signs, x) Funktion zuordnen und dann die Ergebnisse verketten, das heißt die Liste glätten. Genau das tut flatMap.