Как рассчитать 21! (21 factorial) в swift?
Я делаю fuction, который вычисляет факториал в swift. такой
func factorial(factorialNumber: UInt64) -> UInt64 {
if factorialNumber == 0 {
return 1
} else {
return factorialNumber * factorial(factorialNumber - 1)
}
}
let x = factorial(20)
это fuction может вычислить до 20.
Я думаю, что значение факториала (21) больше, чем UINT64_MAX.
тогда как рассчитать 21! (21 factorial) в swift?
3 ответов
64-разрядное целое число без знака имеет максимальное значение 18,446,744,073,709,551,615. А 21! = 51,090,942,171,709,440,000. Для такого случая вам нужен большой целочисленный тип. Я нашел вопрос о большом Integer в Swift. В этой ссылке есть библиотека для Big Integer.
вы думали об использовании двойного возможно? Или 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))
}
Если вы готовы отказаться от точности, вы можете использовать Double для грубого расчета факториалов до 170:
func factorial(_ n: Int) -> Double {
if n == 0 {
return 1
}
var a: Double = 1
for i in 1...n {
a *= Double(i)
}
return a
}
если нет, используйте большую целочисленную библиотеку.