Bla*_*man 9 recursion functional-programming scala list pattern-matching
// But pattern matching also makes it easy.
  def penultimateRecursive[A](ls: List[A]): A = ls match {
    case h :: _ :: Nil => h
    case _ :: tail     => penultimateRecursive(tail)
    case _             => throw new NoSuchElementException
  }
有人可以逐行评论这是做什么的吗?
[A]是否像c#中那样通用我们会做什么?
h似乎没有定义?
我认为算法的主要部分是递归调用:
case _ :: tail     => penultimateRecursive(tail)
似乎没有检查列表中的2个项目,然后拿第一个项目获得第二个,困惑!
Rex*_*err 10
理解模式匹配的关键是要认识到,x :: y将只与单个项目匹配的列表x,然后将列表的其余部分y(这可能只是Nil,也可以是多种元素),这_意味着"需要有在这里是什么,但我们不打扰命名它".(并且匹配按顺序发生,并且列出结束Nil.)
你是正确的,这[A]是一种通用类型.
所以,第一行:
case h :: _ :: Nil => h
说,如果我们的列表看起来像(概念上)Node(h) -> Node(whatever) -> Nil,那么我们回来h.这正是一个包含所选第一个项目的双元素列表.请注意,Nil并不能匹配列表中的任意尾; 它只匹配列表末尾项Nil.这是因为Scala用来区分这两者的规则:小写变量被视为要填充适当值的通配符,而大写变量则被视为要匹配的常量.(如果必须匹配小写名称,则可以通过反引号将其包围.)
好的,现在假设它不是一个双元素列表.然后,如果它不是空的,它将匹配
case _ :: tail => penultimateRecursive(tail)
所以如果我们没有一个双元素列表,我们会扔掉第一个项目并再试一次.最后,如果我们以某种方式永远不会得到一个双元素列表,我们就会到达
case _ => throw new NoSuchElementException
我们完成了.(case Nil实际上,这也可能是因为这是与其他两个条目不匹配的唯一可能性.)
| 归档时间: | 
 | 
| 查看次数: | 2216 次 | 
| 最近记录: |