2012-01-26 38 views
5

Tôi đang cố gắng để tạo ra một danh sách trong scala theo công thức:Danh sách Scala comprehensions

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

hiện tại tôi có:

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

Đối với cuối = 5 nay sẽ cung cấp danh sách:

List(24 , 76) 

Hiện tại, tôi đang bị kẹt khi cố gắng tìm một cách duyên dáng để thực hiện chức năng này cung cấp

List(1 , 24 , 74) 

Mọi đề xuất sẽ được đánh giá cao.

-Lee

Trả lời

4

Làm thế nào về điều này:

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

gì toán tử :: đang làm gì trong trường hợp này? – LeeG

+0

Đó là toán tử "khuyết điểm", tức là toán tử này sẽ thêm trước '1' vào danh sách. – fotNelton

10

tôi muốn tách ra "công thức" từ thế hệ danh sách:

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 

hoặc

def lGen(end: Int) = List.range(1, end + 1, 2) map f 
+0

Tôi thích cách tiếp cận này giữ nguyên định nghĩa. – LeeG

+0

+1 để rõ ràng và tách –

+0

là nó thay đổi kết quả nếu tôi viết thay vì 'trường hợp x nếu x> 1',' trường hợp x> 1'? –

Các vấn đề liên quan