Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 方法评估的行为不符合预期_Scala - Fatal编程技术网

Scala 方法评估的行为不符合预期

Scala 方法评估的行为不符合预期,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) }

下面的代码计算一个斐波那契序列到一个特定数字的总数

但正在引发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)
如果没有这些,当你达到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)
    }
}

可能将标题更改为“评估我的方法…”可能将标题更改为“评估我的方法…”。。。。