Swift 中的阶乘
Factorials in Swift
我需要一个好的阶乘函数。我在这里写的那个完全有效,除非 n 变得太大了。这是一个计算器应用程序,我可以 return 0 / 0 对于不能进行阶乘的值,因为我有一个错误检查器会声明这是不可能的。但是,对非常大的数字执行该功能会使应用程序崩溃。我不能使用范围运算符,因为我的类型是双精度的。
func factorial(n: Double) -> Double {
if n >= 0 {
return n == 0 ? 1 : n * self.factorial(n - 1)
} else {
return 0 / 0
}
}
最好的方法是什么?
正如其他人所说,您可以使用支持更大数字的库,或者只是不允许太大的值。
请注意,如果您想处理非常大的值,您可能需要使用循环而不是递归算法,因为递归会导致 堆栈溢出。是的,没错,SO "eponymous crash".
为了防止数字太大,找出不会崩溃的最大数字,并进行输入检查并拒绝大于该数字的数字。
您可以通过相反的方向并每 10 步记录一次计数和结果来找出导致它崩溃的数字:
1 * 2 * 3 * 4 * 5 * 6...
当你崩溃时,返回到之前记录的最大值,从那里开始插入你之前记录的阶乘结果,一次第 1 步,直到你崩溃。然后只允许 n 比你的崩溃值小 1。
这里是Swift中的一个简单的非递归函数-~`~~-^>>
public func factorial(_ N: Double) -> Double {
var mult = N
var retVal: Double = 1.0
while mult > 0.0 {
retVal *= mult
mult -= 1.0
}
return retVal
}
警告: 此函数仅适用于双精度 >= 0.0 和零尾数
我需要一个好的阶乘函数。我在这里写的那个完全有效,除非 n 变得太大了。这是一个计算器应用程序,我可以 return 0 / 0 对于不能进行阶乘的值,因为我有一个错误检查器会声明这是不可能的。但是,对非常大的数字执行该功能会使应用程序崩溃。我不能使用范围运算符,因为我的类型是双精度的。
func factorial(n: Double) -> Double {
if n >= 0 {
return n == 0 ? 1 : n * self.factorial(n - 1)
} else {
return 0 / 0
}
}
最好的方法是什么?
正如其他人所说,您可以使用支持更大数字的库,或者只是不允许太大的值。
请注意,如果您想处理非常大的值,您可能需要使用循环而不是递归算法,因为递归会导致 堆栈溢出。是的,没错,SO "eponymous crash".
为了防止数字太大,找出不会崩溃的最大数字,并进行输入检查并拒绝大于该数字的数字。
您可以通过相反的方向并每 10 步记录一次计数和结果来找出导致它崩溃的数字:
1 * 2 * 3 * 4 * 5 * 6...
当你崩溃时,返回到之前记录的最大值,从那里开始插入你之前记录的阶乘结果,一次第 1 步,直到你崩溃。然后只允许 n 比你的崩溃值小 1。
这里是Swift中的一个简单的非递归函数-~`~~-^>>
public func factorial(_ N: Double) -> Double {
var mult = N
var retVal: Double = 1.0
while mult > 0.0 {
retVal *= mult
mult -= 1.0
}
return retVal
}
警告: 此函数仅适用于双精度 >= 0.0 和零尾数