下面的代码将斐波纳契序列的总数计算成一个特定的数字。
但是正在引发一个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)
}
错误:
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)
发布于 2013-09-14 21:38:20
def fibonacci(i : Int) : Int = {
println(i)
if (i == 0) 0
else if (i == 1) 1
else fibonacci(i - 1) + fibonacci(i - 2)
}
没有那些else
,当你达到0或1时,你就不会停下来。
发布于 2013-09-14 23:09:30
Scala将自动计算函数的返回值,以作为最后计算的语句的值(这就是不需要return
关键字的原因)。
没有else
,您的两个if
语句是独立语句,而不是函数中的最后一个语句。它们解析为一个值,但是这个值没有分配给任何东西,因此被丢弃,函数继续处理语句。
将else
s放入其中(按照@Marth的解决方案),可以确保函数的结尾只有一个语句,由一个if- end链组成。整个语句(因此,函数)的计算结果是选择并执行链中哪个分支的结果。
还可以使用match
(也将其视为一条语句)实现所需的效果:
def fibonacci(i : Int) : Int = {
println(i)
i match {
case 0 => 0
case 1 => 1
case _ => fibonacci(i - 1) + fibonacci(i - 2)
}
}
https://stackoverflow.com/questions/18806584
复制相似问题