【发布时间】:2016-06-02 20:33:24
【问题描述】:
我正在制作快速计算阶乘的函数。像这样
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 阶乘)快速?
【问题讨论】:
-
我认为这在纯 Swift 中是不可能的。至少不是微不足道的。我不知道任何可以开箱即用地计算这些数字的语言。
-
我个人没用过,不过你可以试试github.com/kirsteins/BigInteger之类的库
-
这可能很难看,但如果你将每次迭代的结果存储在一个字符串而不是 UIint 中,你可以像在纸上一样将它多重化。效率不高,BigInteger 库看起来更有用,但这也是一个选项。
-
你需要阶乘做什么?如果它是方程的一部分(如在某些除法中),那么您可以在迭代步骤中计算方程,使子结果足够小以适应变量。另一种方法是使用
H,L样式变量(每个数字 2 个变量)或使用某种 bigint 库。如果您选择 bigints,那么 Fast exact bigint factorial 可能会有所帮助 -
@dasdom:Python 也是。