2017-04-07 3 views
0

私は階乗を計算する再帰関数を持っています。バックグラウンドスレッドで計算を行いたいのですが、それをどのように処理するのですか? 私はこれしようとしている:どのように素早く再帰関数内の異なるスレッドを扱うのですか?

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 
} 

が、私はこれは間違っていることを理解し、しかし、私がしなければならないかを理解していません。 ありがとうございました!

+1

を使用することができます(高価な操作のための悪い考えである)待つメインスレッドを望んでいた何らかの理由場合非常に標準的な階乗関数を書いて、それをディスパッチ・キューを通して呼び出すだけです。 –

+1

'n'の結果は 'n-1'の結果に依存するため、並列/非同期の計算はあまり意味がありません。計算全体を1つのバックグラウンドキューに入れますが、内部計算はインラインで行います。 –

+3

結果を待つ必要がある場合は、バックグラウンドでそれを行うのは何ですか? – rmaddy

答えて

3

私の推薦は、同期および非同期の機能に分割することです:

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 
} 

これは仕事の肉は潜在的なスレッドの問題を心配することなく、あなたが望むどのように発生することができます。

+0

それは私が欲しいです!ありがとう! –

+0

"使用するスレッドを知りません" - メインを使用しないでください。 ;)global()を使用し、呼び出し元が完了ハンドラを処理する場所を決定させるだけです。それ以外の場合は、完璧な解決策:) – CouchDeveloper

2

ここでは非同期操作が必要なのかどうかはわかりませんが、コードをリファクタリングすることができます(または、そうする必要があります)。

一つの例は次のようになります。

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

しかしあなたははその後、おそらくあなたは、おそらく呼び出しサイトでそれを派遣オフ最善だろう、バックグラウンドスレッドでいくつかの仕事を派遣したいなかった場合。

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

あなたのコードは、メインスレッド上で実行することができませんでした、そしてあなたは、あなたがsync代わりのasync

+0

ありがとうございました!そして、良いファクター関数は、私はそれを使用することはできません、私は二倍の計算が必要 –

関連する問題