Scala REPL在运行factorial时挂起



我研究了下面的链接,它显示了scala消息是多么有趣;)

Scala REPL"她疯了"错误消息

当我尝试这个例子时,它一直挂在那里。这里发生了什么?

这是一个已知的bug吗?这是什么意思吗?

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)

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

CCD_ 2不以任何方式连接到CCD_ 3语句。这意味着,它无条件地执行。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的情况。然而,它仍然接受负数。

最新更新