我有一个递归函数来计算阶乘,我想在后台线程中进行计算,如何处理?
我在尝试:
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
}
这允许以任何您想要的方式完成工作,而不必担心潜在的线程问题。