Scala列表推导式

6
我正在尝试根据公式在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 }
}

对于 end = 5,这将给出列表:
List(24 , 76)

现在我卡在了如何优雅地让这个函数返回结果的问题上。
List(1 , 24 , 74)

任何建议都将不胜感激。- 李
2个回答

13

我会将“公式”与列表生成分开:

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

我喜欢这种方法保持了定义的完整性。 - LeeG
如果我写成case x > 1而不是case x if x > 1,这会改变结果吗? - Slow Harry

5
这个怎么样:
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)

在这种情况下,:: 运算符是做什么的? - LeeG
1
这是一个“cons”操作符,即它将1添加到列表的开头。 - fotNelton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接