我正在制作快速计算阶乘的函数。像这样
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阶乘)快速?答案 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库。
答案 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 {