尝试创建一个打印数组最高元素的递归函数。
它说;
之前需要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)
}
答案 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)
}