我绊倒了下面的链接,其中显示了有趣的scala消息;)
Scala REPL "She's gone rogue" error message
当我尝试这个例子时,它永远挂了。这里发生了什么?
这是一个已知的错误吗?它是某种陷阱吗?
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)
答案 0 :(得分:3)
问题正是代码中指出的内容,return
缺失。递归永远不会终止。
factorial(n - 1)
未以任何方式与if
语句相关联。这意味着,它无条件执行。 factorial()
wil 始终自行调用。
添加基本案例(即递归停止的地方):
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
。但是,它仍然接受负数。