递归方法不起作用。需要; ?

时间:2012-09-20 03:01:12

标签: scala

尝试创建一个打印数组最高元素的递归函数。

它说;之前需要else maxi=xs.head}之后需要max(xs.tail)

我不认为scala使用半冒号,你何时应该使用它们以及其他一些基本的句法规则。

var maxi = 0 
def max(xs: List[Int]): Int = {if (xs.isEmpty) throw new java.util.NoSuchElementException() 
      else if (xs.tail.isEmpty) maxi
      else if (xs.tail.head > xs.head) maxi = xs.tail.head
      max(xs.tail)
      else maxi=xs.head
      max(xs.tail)
}

6 个答案:

答案 0 :(得分:8)

这看起来像是家庭作业,我的基础是这是Odersky在线Coursera课程中第一个家庭作业的一部分。

如果不是,请告诉我,但我会认为是,所以我只是给出一个提示..看看你的if / else分支是如何组织的。

课程中的第一周视频涵盖了Scala的分号推断。

答案 1 :(得分:6)

一些正确的格式将显示问题:

var maxi = 0 
def max(xs: List[Int]): Int = {
  if (xs.isEmpty) 
    throw new java.util.NoSuchElementException() 
  else if(xs.tail.isEmpty) 
    maxi
  else if(xs.tail.head > xs.head) { // <-- need this opening brace
    maxi = xs.tail.head             // because there are two lines 
    max(xs.tail)                    // in the body of the if-statement
  }                                 // <-- and this closing brace
  else {
    maxi=xs.head
    max(xs.tail)
  }
}

分号在Scala代码中有效,但它们不需要它们在Java中。换句话说,您可以编写不需要它们的代码,或者如果您愿意,可以将它们用于某些事情。

答案 2 :(得分:4)

Scala使用分号,但它们在一行末尾是可选的。也就是说,如果分号在一行的末尾是合法的(即该行不在表达式的中间结束(如a +)),则会自动插入一个分号。

尽管如此,尽管出现错误消息,但您的问题实际上并没有与分号有任何关系。你的问题是,如果你想在if-或else块中包含多个表达式,你需要大括号。

PS:请注意,使用可变的非局部变量来跟踪您的状态在设计方面是一个坏主意,如果您不止一次调用您的方法(不重置之间的变量),将会给您带来麻烦。 / p>

PPS:当xs.tail为空时,您应该仔细查看您的操作。你确定逻辑是正确的吗?

答案 3 :(得分:2)

这是一个Coursera&#39;功能编程与Scala&#39;示例作业。你有这类问题的课程论坛。

你应该深入研究递归并解决这个任务,而不需要任何额外的变量。关于辅助函数的列表源中有一个提示。使用它。

答案 4 :(得分:1)

def max(xs: List[Int]): Int = {
  def loop(a: Int, b: List[Int]): Int = {
    if (b.tail.isEmpty)
      if (a >= b.head) a
      else b.head
    else 
      if (a >= b.head) loop(a, b.tail)
      else loop(b.head, b.tail)
  }
  if (xs.isEmpty) throw new java.util.NoSuchElementException()
  else loop(xs.head, xs.tail)  
  }

答案 5 :(得分:0)

def max(xs: List[Int]): Int = {
  def maxNew(xs: List[Int], maxx: Int): Int ={
   if(xs.isEmpty) maxx else { 
     if (maxx<=xs.head) 
      maxNew(xs.tail, xs.head)
    else 
      maxNew(xs.tail, maxx)
   }
 }

  if(xs.isEmpty) throw new java.util.NoSuchElementException()
  else maxNew(xs,0)        
}