2015-11-12 9 views
6

Sto facendo fuction che calcola fattoriale in rapido. Ti piace questaCome calcolare il 21! (21 fattoriale) in rapido?

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

let x = factorial(20) 

questo fuction può calcolare fino a 20.

credo (21) il valore fattoriale più grande di UINT64_MAX.

quindi Come calcolare il 21! (21 fattoriale) in rapido?

+0

credo che questo non è possibile in puro Swift. Almeno non banale. Non conosco nessun linguaggio in grado di calcolare tali numeri fuori dalla scatola. – dasdom

+0

Non l'ho usato personalmente, ma puoi provare una libreria come https://github.com/kirsteins/BigInteger – Kevin

+0

Potrebbe essere brutto, ma se memorizzi il risultato di ogni iterazione in una stringa invece di un UIint, puoi moltiplicarlo come se fosse in carta. Non efficiente, la libreria BigInteger sembra più utile, ma anche questa è un'opzione. –

risposta

3

Il numero intero a 64 bit senza segno ha un valore massimo di 18.446.744.073.709.551.615. Mentre 21! = 51.090.942.171.709.440.000. Per questo tipo di caso, è necessario un tipo di intero grande. Ho trovato una domanda su Big Integer in Swift. C'è una libreria per Big Integer in quel collegamento.

BigInteger equivalent in Swift?

0

Hai pensato di usare un doppio, forse? O NSDecimalNumber?

Anche chiamare la stessa funzione in modo ricorsivo è davvero negativo.

ne dite di usare un ciclo:

let value = number.intValue - 1 

var sum = NSDecimalNumber(value: number.intValue) 

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