2015-11-12 8 views
6

Ich mache Funktion, die factorial in swift berechnen. wie dieseWie berechnet man die 21! (21 Fakultät) in swift?

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

let x = factorial(20) 

kann dieses fuction 20.

, bis berechnen Ich denke faktorielles (21) Wert größer als UINT64_MAX.

dann Wie berechnet man die 21! (21 Fakultät) in swift?

+0

Ich denke, das in reinem Swift nicht möglich ist. Zumindest nicht trivial. Ich kenne keine Sprache, die solche Zahlen aus der Box berechnen kann. – dasdom

+0

Ich habe es nicht persönlich verwendet, aber Sie können versuchen, eine Bibliothek wie https://github.com/kirsteins/BigInteger – Kevin

+0

Es kann hässlich sein, aber wenn Sie das Ergebnis jeder Iteration in einer Zeichenfolge statt a speichern UIint, du kannst es multiplizieren, wie es in Papier war. Nicht effizient, die BigInteger-Bibliothek sieht nützlicher aus, aber dies ist auch eine Option. –

Antwort

3

Vorzeichenlose 64-Bit-Ganzzahl hat einen Maximalwert von 18.446.744.073.709.551.615. Während 21! = 51.090.942.171.709.440.000. Für diesen Fall benötigen Sie einen Big Integer-Typ. Ich habe eine Frage zu Big Integer in Swift gefunden. Es gibt eine Bibliothek für Big Integer in diesem Link.

BigInteger equivalent in Swift?

0

Dachten Sie vielleicht eine doppelte über die Verwendung? Oder NSDecimalNumber?

Auch rekursiv die gleiche Funktion aufrufen ist wirklich schlecht Leistung.

Wie wäre es mit einer Schleife:

let value = number.intValue - 1 

var sum = NSDecimalNumber(value: number.intValue) 

for i in (1...value).reversed() { 
    sum = sum.multiplying(by: NSDecimalNumber(value: i)) 
} 
Verwandte Themen