斯威夫特的因子

mod*_*itt 3 factorial swift

我需要一个很好的阶乘功能.我在这里写的那个完全有效,除非n太大了.这是一个计算器应用程序,我可以返回0/0的值不能被因素,因为我有一个错误检查器,将声明这是不可能的.但是,在非常大的数量上执行该功能会使应用程序崩溃.我不能使用范围运算符,因为我的类型是双精度数.

func factorial(n: Double) -> Double {
    if n >= 0 {
        return n == 0 ? 1 : n * self.factorial(n - 1)
    } else {
        return 0 / 0
    }
}
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?

Dun*_*n C 5

正如其他人所说,你可以使用支持更大数字的库,或者只是不允许太大的值.

请注意,如果要处理非常大的值,则可能需要使用循环而不是递归算法,因为递归会导致堆栈溢出.是的,这是正确的,一个SO"同名的崩溃".

为了防止数字太大,找出不会崩溃的最大数字,并输入检查并拒绝大于此数字的数字.

您可以通过向相反的方向计算出崩溃的数字,并每10步记录计数和结果:

1*2*3*4*5*6 ......

崩溃时,返回到之前记录的最大值,从那里开始插入先前记录的因子结果,然后逐步执行步骤1直到崩溃.然后只允许n比崩溃值小1.