我正在尝试在 Scala 中实现一个递归函数来计算列表中的最大值

I am trying to implement a recursive function in Scala to calculate Maximum value in a List

def max(xs: List[Int]): Int = {
  if (xs.isEmpty) throw new java.util.NoSuchElementException("List is Empty")
  else
     max1(0,xs)

  def max1(num :Int, x : List[Int]) : Int = {
    if(x.isEmpty) return num 
    else if(num>x.head) max1(num,x.tail) 
    else
      max1(x.head,x.tail)
  }
}

我正在尝试实现代码以在输入空列表时抛出错误,并尝试使用另一个辅助函数以递归方式获取列表的最大值

error: type mismatch; found : Unit required: Int

max1的定义放在if语句之前。 函数的 return 值是其主体中最后一条语句的结果。你现在的方式,最后一条语句是 def,它的结果是 Unit.

您可以使用这些代码来解决该问题。

object Maximum {
  def apply(numbers: List[Int]): Int = {
    if (numbers.isEmpty) throw new Exception("List shouldn't be empty")
    max(numbers)
  }

  private def max(numbers: List[Int], maxNumb: Int = 0): Int = numbers match {
    case x::xs => if (x > maxNumb) max(xs, x) else max(xs, maxNumb)
    case Nil => maxNumb
  }
}

Maximum(List(1,9,9,12,34))
Maximum(List())

您可以使用用户 require()

例如使用这个更惯用的递归代码:

def max(xs: List[Int]): Int = {
  require( xs.nonEmpty, ">>> Empty List <<<" )

  def max1( num:Int, x:List[Int] ) : Int = x match {
    case Nil => num
    case y :: ys => max1( (if( num>y ) num else y), ys )
  }

  max1(0,xs)
}

然后,

max(List())

returns:java.lang.IllegalArgumentException:要求失败:>>> 空列表 <<<

定义

trait XInt
case class N(i: Int) extends XInt
case object NoInt extends XInt

和模式匹配一​​个空列表 return NoInt 否则一个 N 实例。