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

标签 swift math

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

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

let x = factorial(20)

这个函数可以计算到20。

我认为阶乘(21)值大于 UINT64_MAX。

那么如何计算21! (21 阶乘)用 swift 表示?

最佳答案

func factorial(_ n: Int) -> Double {
  return (1...n).map(Double.init).reduce(1.0, *)
}
  1. (1...n):我们创建一个包含运算中涉及的所有数字的数组(即:[1, 2, 3, .. .]).

  2. map(Double.init):我们从 Int 更改为 Double,因为我们可以使用 Double 表示比使用 Double 更大的数字整数 (https://en.wikipedia.org/wiki/Double-precision_floating-point_format)。因此,我们现在拥有了参与运算的所有数字的数组,作为 double (即:[1.0, 2.0, 3.0, ...])。

  3. reduce(1.0, *):我们开始将 1.0 与数组中的第一个元素相乘 (1.0*1.0 = 1.0) >),然后是与下一个的结果 (1.0*2.0 = 2.0),然后是与下一个的结果 (2.0*3.0 = 6.0) ,等等。

第 2 步是避免溢出问题。

第 3 步是让我们免于显式定义用于跟踪部分结果的变量。

关于swift - 21如何计算! (21 阶乘)快速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35536313/

相关文章:

java - 使用Math类来计算

java - 当 x = 0 时,Java 的 Math.pow(x, 2) 性能不佳

database - 关系数据库和数学?

ios - Swift 3 - 多 View Controller 错误

swift - SWXMLHash 的反序列化错误

ios - 将文本拆分为数组,同时保持 Swift 中的标点符号

javascript - 在 JavaScript 中获取 "To the power off"的准确值

c# - 将值标准化为 -1 到 1 之间的范围

swift - 从 swift 2.3 迁移到 swift 3 时出错

ios - PushViewController 上的 UINavigation/inputAccessoryView 问题