2016-09-30 20 views
-3

私はユニットテストをしており、100の階乗を計算することはできません。私はBigIntを使用すると助けになると読んでいますが、私は何が間違っているのか分かりません。なぜ100の階乗をスカラーで計算できないのですか?

ここは私の機能です。私はrecursive_factorial(100)との関数を呼び出す場合

package Factorial{ 
class factorial 
{ 
    def recursive_factorial(number:BigInt) : BigInt = 
    { 
    if (number == 0) 
     return 1 
    number * recursive_factorial (number - 1) 
    } 
} 
} 

が..私は数がすべての最初のint

+0

私はあなたのコードを取り、適切なメインメソッドを追加すると正常に動作するので、表示されなかったコードでエラーが発生していると考えられます。問題を再現する*実行可能コード*とエラーメッセージを投稿してください。 – sepp2k

答えて

2

投稿したコードは正常に動作します。問題は、あなたが(あなたが別の答えにコメントして掲載)あなたのコードをテストするために使用するコードです:

assertResult(93326215443944152681699238856266700490715968264‌​38162146859296389521‌​75999932299156089414‌​63976156518286253697‌​92082722375825118521‌​09168640000000000000‌​00000000000) { 
    factorial.recursive_factorial(100) 
} 

問題は整数リテラルはタイプIntと番号93326を持っているということです...明らかに大きすぎますintに収まるように、整数リテラルを使用して表現することはできません。

大きな数値のBigIntを作成する方法の1つは、文字列として書き込んで、それをBigIntに変換することです。したがって、これは正常に動作します:

assertResult(BigInt("93326215443944152681699238856266700490715968264‌​38162146859296389521‌​75999932299156089414‌​63976156518286253697‌​92082722375825118521‌​09168640000000000000‌​00000000000")) { 
    factorial.recursive_factorial(100) 
} 
+0

おかげ!それは働いた – user6800688

1

に対して大きすぎるというエラーを取得し、あなたの関数はStackOverflowのときの原因となるという問題があります数字が大きすぎます。あなたは尾再帰的にそれを書く必要があります。

@annotation.tailrec 
def recursive_factorial(number: BigInt, result: BigInt = 1): BigInt = { 
    if (number == 0) 
    result 
    else 
    recursive_factorial(number -1, result * number) 
} 

そうでない場合は、あなたのコード例では、私のために完璧に動作し、私はあなたの問題が何であるかを知りません。おそらく、この関数の結果(BigInt)を、エラーを引き起こすある時点でIntに書き込もうとします。

+0

これを追加しました。 { \t assertResult(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000) \t {\t factorial.recursive_factorial(100) \t} \t} – user6800688

関連する問題