2012-01-26 3 views
5

Я пытаюсь создать список в Скале по формуле: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) 

Прямо сейчас я застрял на том, чтобы найти gracefull способ сделать эту функцию дать

List(1 , 24 , 74) 

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

-Ли

ответ

4

Как об этом:

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) 
+0

Что это оператор :: в этом случае? – LeeG

+0

Это оператор «cons», то есть он добавляет «1» в список. – fotNelton

10

Я бы выделить "формулу" из поколения списка:

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 
+0

Мне нравится, как этот подход сохраняет целостность. – LeeG

+0

+1 для ясности и развязки –

+0

это изменение результата, если я пишу вместо 'case x, если x> 1',' case x> 1'? –

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