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