如何计算21! (21阶乘)快速?

时间:2015-11-12 07:24:20

标签: swift math

我正在制作快速计算阶乘的函数。像这样

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

let x = factorial(20)

这个功能可以计算直到20。

我认为factorial(21)的值大于UINT64_MAX。

那么如何计算21! (21阶乘)快速?

7 个答案:

答案 0 :(得分:5)

无符号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?

答案 1 :(得分:3)

func factorial(_ n: Int) -> Double {
  return (1...n).map(Double.init).reduce(1.0, *)
}

答案 2 :(得分:2)

您是否考虑过使用双倍?还是NSDecimalNumber?

还递归地调用相同的函数是非常糟糕的性能。

如何使用循环:

let value = number.intValue - 1

var product = NSDecimalNumber(value: number.intValue)

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

答案 3 :(得分:0)

如果您愿意放弃精确度,可以使用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
}

如果没有,请使用大整数库。

答案 4 :(得分:0)

这是一个函数,可以接受任何符合Numeric协议的类型,它们都是内置数字类型。

func factorial<N: Numeric>(_ x: N) -> N {
    x == 0 ? 1 : x * factorial(x - 1)
}

答案 5 :(得分:-1)

使用递归来解决此问题:

    func factorial(_ n: UInt) -> UInt {
        return n < 2 ? 1 : n*factorial(n - 1)
    }

答案 6 :(得分:-1)

if (props.username == null) {

       this.setState({
            loginButton: <GoogleButton></GoogleButton>
       })

} else {