Scala Список Пониманий - PullRequest
       29

Scala Список Пониманий

6 голосов
/ 26 января 2012

Я пытаюсь создать список в Scala по формуле:

for n > 1 f(n) = 4*n^2 - 6*n + 6 and for n == 1 f(n) = 1

В настоящее время у меня есть:

def lGen(end: Int): List[Int] = {
    for { n <- List.range(3 , end + 1 , 2) } yields { 4*n*n - 6*n - 6 }
}

Для конца = 5 это даст список:

List(24 , 76)

Сейчас я застрял в попытке найти изящный способ заставить эту функцию давать

List(1 , 24 , 74)

Любые предложения будут с благодарностью приняты.

-Lee

Ответы [ 2 ]

11 голосов
/ 26 января 2012

Я бы отделил «формулу» от генерации списка:

val f : Int => Int = {
  case 1 => 1
  case x if x > 1 => 4*x*x - 6*x + 6
}

def lGen(end: Int) = (1 to end by 2 map f).toList

или

def lGen(end: Int) = List.range(1, end + 1, 2) map f
5 голосов
/ 26 января 2012

Как насчет этого:

scala> def lGen(end: Int): List[Int] =
         1 :: List.range(3, end+1, 2).map(n => 4*n*n - 6*n + 6)

scala> lGen(5)
res0: List[Int] = List(1, 24, 76)
...