2015-11-12 16 views
6

私は素早くfactorialを計算するfuctionを作っています。この21を計算する方法!迅速に(21階乗)?

func factorial(factorialNumber: UInt64) -> UInt64 { 
    if factorialNumber == 0 { 
     return 1 
    } else { 
     return factorialNumber * factorial(factorialNumber - 1) 
    } 
} 

let x = factorial(20) 

のように、こののfuctionは私がUINT64_MAXより大きな階乗(21)値を考えてそれまでは20

を計算することができます。

次に21を計算する方法!迅速に(21階乗)?

+0

:どのようにループを使用する方法について

。少なくとも些細なことではない。私はそのような数を計算できる言語は知らない。 – dasdom

+0

私は個人的に使っていませんが、https://github.com/kirsteins/BigIntegerなどのライブラリを試すことができます – Kevin

+0

醜いかもしれませんが、各繰り返しの結果をUIint、それは紙のように複数のことができます。効率的ではないが、BigIntegerライブラリはより有用に見えるが、これもオプションである。 –

答えて

3

符号なし64ビット整数の最大値は18,446,744,073,709,551,615です。 21時! = 51,090,942,171,709,440,000。このような場合、Big Integer型が必要です。私はSwiftのBig Integerに関する質問を見つけました。そのリンクにBig Integerのライブラリがあります。

BigInteger equivalent in Swift?

0

あなたはおそらく、二重を使用して考えていましたか?またはNSDecimalNumber?

また、同じ関数を再帰的に呼び出すと、パフォーマンスが悪くなります。私は、これは純粋スウィフトでは不可能だと思う

let value = number.intValue - 1 

var sum = NSDecimalNumber(value: number.intValue) 

for i in (1...value).reversed() { 
    sum = sum.multiplying(by: NSDecimalNumber(value: i)) 
} 
関連する問題