【问题标题】:Scala List ComprehensionsScala 列表理解
【发布时间】:2012-02-19 07:55:08
【问题描述】:

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

任何建议将不胜感激。

-李

【问题讨论】:

    标签: scala list-comprehension yield scala-2.9


    【解决方案1】:

    这个怎么样:

    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)
    

    【讨论】:

    • 在这种情况下 :: 运算符在做什么?
    • 这是一个 "cons" 运算符,即将1 添加到列表中。
    【解决方案2】:

    我会从列表生成中分离出“公式”:

    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
    

    【讨论】:

    • 我喜欢这种方法如何保持定义完整。
    • 如果我写而不是case x if x &gt; 1case x &gt; 1,会改变结果吗?
    猜你喜欢
    • 2016-06-16
    • 2013-06-21
    • 2016-04-05
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多