2012-01-26 154 views
5

我試圖根據公式生成階的列表:斯卡拉列表綜合

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 if x> 1',case x> 1',它會改變結果嗎? –