首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法评价不像预期的那样

方法评价不像预期的那样
EN

Stack Overflow用户
提问于 2013-09-14 21:30:16
回答 2查看 67关注 0票数 1

下面的代码将斐波纳契序列的总数计算成一个特定的数字。

但是正在引发一个StackOverFlow异常。为什么在检查函数中的0时抛出此异常?

代码语言:javascript
运行
复制
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)

}

错误:

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 21:38:20

代码语言:javascript
运行
复制
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时,你就不会停下来。

票数 3
EN

Stack Overflow用户

发布于 2013-09-14 23:09:30

Scala将自动计算函数的返回值,以作为最后计算的语句的值(这就是不需要return关键字的原因)。

没有else,您的两个if语句是独立语句,而不是函数中的最后一个语句。它们解析为一个值,但是这个值没有分配给任何东西,因此被丢弃,函数继续处理语句。

elses放入其中(按照@Marth的解决方案),可以确保函数的结尾只有一个语句,由一个if- end链组成。整个语句(因此,函数)的计算结果是选择并执行链中哪个分支的结果。

还可以使用match (也将其视为一条语句)实现所需的效果:

代码语言:javascript
运行
复制
def fibonacci(i : Int) : Int = {
    println(i)
    i match {
        case 0 => 0
        case 1 => 1
        case _ => fibonacci(i - 1) + fibonacci(i - 2)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18806584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档