繁体   English   中英

如何快速处理递归函数中的不同线程?

[英]How handle different threads in recursive function in swift?

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

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
}

这样一来,工作就可以以您想要的任何方式进行,而不必担心潜在的线程问题。

我不确定这里是否需要异步操作,但是您可以(也许应该)重构代码。

一个示例可能是:

func factorial(n: Int) -> Int {
    return (2...n).reduce(1, *)
}

但是,如果您确实想在后台线程上分派一些工作,那么您可能最好在调用站点分派它。

DispatchQueue.global(qos: .background).async {
    print(factorial(n: 12))
}

如果由于某种原因您的代码无法在主线程上运行,并且您希望主线程等待(这对于昂贵的操作来说是个坏主意),则可以使用sync而不是async

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM