2**32
)の計算をしても、
桁あふれは発生する。
まず作ってみた
def fac(n:Int):Int={
if(n==0) 1
else n * fac(n-1)
}
関数の本体を囲むブレース {}
は、
この例のように本体の中に式が1つならば、省略できる。
def fac(n:Int):Int=
if(n==0) 1
else n * fac(n-1)
この関数に、正の数を与えると正しく動作する。
scala> fac(5)
res1: Int = 120
scala> fac(10)
res2: Int = 3628800
この問題は、一か所の変更(比較の演算子)だけで、とりあえず回避することができる。
def fac(n:Int):Int=
if(n<=0) 1
else n * fac(n-1)
Intでなく Long型にすると、より大きな数が扱える。
def fac(n:Long):Long=
if(n<=0) 1
else n * fac(n-1)
fac(20)
までは扱えるがfac(21)
以上は
オーバーフローするようだ。math.BigInt クラスを使えば、無制限の桁数に対応している。
def fac(n:math.BigInt):math.BigInt=
if(n<=0) 1
else n * fac(n-1)
例えばfac(50)などの結果がどのぐらいの桁数になるか 試してみて下さい。
scala> fac(1000).toString.length
res25: Int = 2568