1

我偶然发现了下面的链接,它显示了 scala 消息是多么有趣;)

Scala REPL“她流氓”错误消息

当我尝试这个示例时,它永远挂起。这里发生了什么?

这是一个已知的错误吗?它是某种陷阱吗?

Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29
).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def factorial(n: Int):Int = {
     |   if (n == 1) n    // forgot 'return' here
     |   factorial(n - 1)
     | }
factorial: (n: Int)Int

scala> factorial(10)
4

1 回答 1

3

问题正是代码中指示的内容,return缺少。递归永远不会终止。

factorial(n - 1)与该 if声明没有任何关系。这意味着,它无条件执行。将始终factorial()自称。

添加一个基本案例(即递归停止的地方):

def factorial(n: Int):Int = {
     |   if (n == 1) return n
     |   factorial(n - 1)
     | }

这也可以:

def factorial(n: Int):Int = {
     |   if (n == 1) n
     |   else factorial(n - 1)
     | }

这实际上将产生 n 的阶乘(其他返回 1):

def factorial(n: Int):Int = {
     |   if (n <= 1) 1
     |   else n * factorial(n - 1)
     | }

请注意,这也适用于这种情况n = 0。但是,它仍然接受负数。

于 2012-08-04T15:38:47.773 回答