我有一个递归函数来计算阶乘,我想在后台线程中进行计算,如何处理?
我在尝试:

func factorial(of number: Double) -> Double {
    var result: Double = 0
    if number > 170 {
        return Double.infinity
    }
    if number != Double(Int(number)) || number < 1 {return 0}
    if number == 1 {
        return 1
    }
    DispatchQueue.global(qos: .background).async {
        result = number * factorial(of: number - 1)
    }
    return result
}

我明白这是错的,但我不明白我该怎么做。
谢谢你的帮助!

最佳答案

我的建议是将其分为同步和异步函数:

func factorial(of number: Double, completion: @escaping (Double) -> ()) {

    DispatchQueue.global(qos: .background).async {
        let result = factorial(of: number)
        DispatchQueue.main.sync { //I don't know what thread you're intending to use, so I picked main :)
            completion(result)
        }
    }
}

func factorial(of number: Double) -> Double {

    var result: Double = 0
    if number > 170 {
        return Double.infinity
    }
    if number != Double(Int(number)) || number < 1 {return 0}
    if number == 1 {
        return 1
    }

    result = number * factorial(of: number - 1)

    return result
}

这允许以任何您想要的方式完成工作,而不必担心潜在的线程问题。

10-07 19:29
查看更多