如何在IntList中找到最大值?

时间:2015-04-05 15:53:03

标签: list scala max

我正在编写一个函数,它将在IntList中找到最大的元素。我知道如何在Java中执行此操作,但无法理解如何在Scala中执行此操作。

我做到了,到目前为止,这就是我所拥有的,我认为应该是它。

abstract class IntList
case class Nil() extends IntList
case class Cons(h: Int, t: IntList) extends IntList

object ListFuns {
   // return the maximum number in is
   // return the maximum number in is
   def maximum(is: IntList): Int = is match {
      case Nil() => 0
      case list => max(head(is), tail(is))
   }

   def head(l : IntList) : Int = l match {
      case Nil() => 0
      case Cons(e,tail) => e
   }

   def tail(l : IntList) : IntList = l match {
      case Nil() => Nil()
      case Cons(e,tail) => tail
   }

   def max(n : Int, l : IntList) : Int = l match {
      case Nil() => n
      case l => {
          val h = head(l)
          var champ = 0
          if(n > h) {
            champ = n 
            n
          }
          else{
            champ = h
            h
          } 
          if(tail(l) == Nil()){
            champ
          }
          else{
            max(champ, tail(l))
          }
        }
      }
}

1 个答案:

答案 0 :(得分:0)

模式匹配会缩短它:

def maximum(l: IntList) : Int = l match {
   case Cons(singleValue, Nil) => singleValue
   case Nil() => // you decide, 0, the min value of ints, throw....
   case Cons(head, tail) => 
      val maxOfTail = maximum(tail)
      if(maxOfTail > head) maxOfTail else head
}

小调:

  • 您可以将案例类Nil()更改为案例对象Nil
  • 最后两行应该只是head max maximum(tail)head.max(maximum(tail)),无论你哪个更舒服(它们都是一样的)。

这只是一个起点,随着你的进一步了解,你会发现我的方法不是尾递归的并不太好。您可能还会考虑是否可以为空列表案例返回一个选项。另外,请注意最大值,最小值,总和,产品......的实现非常相似,并尝试将其考虑在内。