Scala 方法评估的行为不符合预期
下面的代码计算一个斐波那契序列到一个特定数字的总数 但正在引发StackOverFlow异常。为什么在我检查时抛出此异常 对于函数中的0Scala 方法评估的行为不符合预期,scala,Scala,下面的代码计算一个斐波那契序列到一个特定数字的总数 但正在引发StackOverFlow异常。为什么在我检查时抛出此异常 对于函数中的0 object fibonacci extends Application { def fibonacci(i : Int) : Int = { println(i) if(i == 0) 0 if(i == 1) 1 fibonacci(i - 1) + fibonacci(i - 2) } fibonacci(3) }
object fibonacci extends Application {
def fibonacci(i : Int) : Int = {
println(i)
if(i == 0) 0
if(i == 1) 1
fibonacci(i - 1) + fibonacci(i - 2)
}
fibonacci(3)
}
错误:
scala> fibonacci(3)
3
2
1
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
.......
scala> fibonacci(3)
java.lang.StackOverflowError
at .fibonacci(<console>:10)
at .fibonacci(<console>:10)
at .fibonacci(<console>:10)
at .fibonacci(<console>:10)
如果没有这些,当你达到0或1时,你不会停止
如果没有这些,当达到0或1时,您不会停止。Scala将自动计算函数的返回值,使其成为最后计算的语句的值。这就是您不需要return关键字的原因 如果没有ELSE,两条if语句是独立语句,但不是函数中的最后一条语句。它们解析为一个值,但该值没有分配给任何对象,因此被丢弃,函数继续处理语句 按照@Marth的解决方案将else放入函数中,可以确保您使用一条由单个if-else链组成的语句来结束函数。整个语句,因此,函数的计算结果是选择并执行链的哪个分支的结果 您还可以使用一个匹配语句来实现所需的效果,该匹配语句也被视为一条语句:
def fibonacci(i : Int) : Int = {
println(i)
i match {
case 0 => 0
case 1 => 1
case _ => fibonacci(i - 1) + fibonacci(i - 2)
}
}
Scala会自动将函数的返回值计算为最后计算的语句的值,这就是您不需要return关键字的原因 如果没有ELSE,两条if语句是独立语句,但不是函数中的最后一条语句。它们解析为一个值,但该值没有分配给任何对象,因此被丢弃,函数继续处理语句 按照@Marth的解决方案将else放入函数中,可以确保您使用一条由单个if-else链组成的语句来结束函数。整个语句,因此,函数的计算结果是选择并执行链的哪个分支的结果 您还可以使用一个匹配语句来实现所需的效果,该匹配语句也被视为一条语句:
def fibonacci(i : Int) : Int = {
println(i)
i match {
case 0 => 0
case 1 => 1
case _ => fibonacci(i - 1) + fibonacci(i - 2)
}
}
可能将标题更改为“评估我的方法…”可能将标题更改为“评估我的方法…”。。。。