斯威夫特的因子

时间:2015-06-23 00:55:14

标签: swift factorial

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

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

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

答案 1 :(得分:0)

这是Swift中一个简单的非递归函数 - ~`~~ - ^>>

Decimal

警告:此功能仅适用于双打> = 0.0和零尾数