Как рассчитать 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.

эквивалент BigInteger в Swift?


вы думали об использовании двойного возможно? Или 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
}

если нет, используйте большую целочисленную библиотеку.