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 和零尾数