1

私は、scala メッセージがいかに面白いかを示す以下のリンクにつまずいた ;)

Scala REPL "She's gone rogue" エラー メッセージ

この例を試してみると、永久にハングしました。ここで何が起こっているのですか?

これは既知のバグですか?何か落とし穴ですか?

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 に答える