[英]How to calculate the 21! (21 factorial) in swift?
我正在制作快速计算阶乘的功能。 像这样
func factorial(factorialNumber: UInt64) -> UInt64 {
if factorialNumber == 0 {
return 1
} else {
return factorialNumber * factorial(factorialNumber - 1)
}
}
let x = factorial(20)
func factorial(_ n: Int) -> Double {
return (1...n).map(Double.init).reduce(1.0, *)
}
(1...n)
:我们创建一个包含操作中涉及的所有数字的数组(即: [1, 2, 3, ...]
)。
map(Double.init)
:我们从Int
更改为Double
因为我们可以用 Double 表示比Int
更大的数字( https://en.wikipedia.org/wiki/Double-precision_floating-point_format )。 因此,我们现在将所有参与运算的数字作为Doubles
数组(即: [1.0, 2.0, 3.0, ...]
)。
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 步是避免我们显式定义用于跟踪部分结果的变量。
无符号 64 位整数的最大值为 18,446,744,073,709,551,615。 虽然21! = 51,090,942,171,709,440,000。 对于这种情况,您需要一个 Big Integer 类型。 我在 Swift 中发现了一个关于 Big Integer 的问题。 该链接中有一个 Big Integer 库。
您是否考虑过使用 double ? 还是 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))
}
这是一个函数,它接受任何符合Numeric
协议的类型,这些类型都是内置的数字类型。
func factorial<N: Numeric>(_ x: N) -> N {
x == 0 ? 1 : x * factorial(x - 1)
}
如果您愿意放弃精度,您可以使用 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
}
如果没有,请使用大整数库。
func factoruial(_ num:Int) -> Int{
if num == 0 || num == 1{
return 1
}else{
return(num*factoruial(num - 1))
}
}
var 温度:双 = 1.0
函数阶乘(x:Double) -> Double{
if(x==0){
return temp
}else{
factorial(x: x-1)
temp *= x
}
return temp
}
阶乘(x:21.0)
func factorial(a: Int) -> Int {
return a == 1 ? a : a * factorial(a: a - 1)
}
print(factorial(a : 5))
print(factorial(a: 9))
使用递归来解决这个问题:
func factorial(_ n: UInt) -> UInt {
return n < 2 ? 1 : n*factorial(n - 1)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.