2017-03-11 5 views
0

私は、タスクを使用して数値の階乗を計算する方法を探しています。私の目的は、逐次ループを使って結果を階乗と比較することです。例えば、 16!タスク1 = 16 * 15 * 14 * 13 * 12 * 11とタスク2 = 10 * 9 * 8 * 7 * 6とタスク3 = 5 * 4 * 3 * 2 * 1 オンラインで検索しましたが、私の必要性。期待してくれてありがとう。タスクを使用するファクタリック

static long factorialmethod(int number) 
     { 
      long factorial; 
      factorial = number; 
      if (number <= 1) { return 1; } 
      else 
      for (int i = number-1; i >= number; i--) 
      { 
       factorial *= i; 
      } 
     return factorial; 
      } 
     static void Main(string[] args) 
     { 
     int number; 
     Console.WriteLine("Please input your whole number"); 
     number = int.Parse(Console.ReadLine()); 
     Console.WriteLine("\nFactorial of the number is {0}",factorialmethod(number)); 
     Console.ReadKey() 
     } 
+0

なぜタスクを使いたいですか?あなたの例が示すように、あなたは基本から始めることができます。これを読むことをお勧めします:[タスクベースの非同期プログラミング](https://msdn.microsoft.com/en-us/library/dd537609(v=vs.110) ).aspx)次に、どこから開始するかを知っています。 –

答えて

1

計算階乗はPLINQパラレルのLINQ)である場合、並列しようとする最も簡単な方法:

using System.Linq; 

    ... 

    static long factorialmethod(int number) { 
     if (number <= 1) 
     return 1; // strictly speaking, factorial on negative (-N)! = infinity 

     return Enumerable 
     .Range(1, number) 
     .AsParallel() // comment it out if you want sequential version 
     .Aggregate(1L, (s, a) => s * a); 
    } 

使用Stopwatchベンチマーク。 .AsParallel()をコメントアウト:あなたは本当に並列実装をしたいですか(Taskのみ)?

+0

はい。私は並列実装が欲しい。与えられた任意の数を3つのセグメントに分割し、それらを並列に実行します。上記のコードに示すように、結果を通常の階乗計算と比較したいと思います。ありがとうございました。 – Awani

0

@DmitryBychenkoの回答は、PLINQの方法にしたい場合は使用できます。しかし、代わりにParallelライブラリを直接使用することもできます。文字通りタスクライブラリを使ってあなたの述べられた問題を解決しようとしているなら、私はPLINQがよりクリーンなソリューションだと思っていますが、ポストされた質問をより類似した問題の縮小バージョンとして使用する場合、ヘルプ

static long Factorial(int number) { 
    if (number < 1) 
     return 1; 

    var results = new ConcurrentBag<long>(); 
    Parallel.ForEach(Partitioner.Create(1, number + 1, 5 /*You can select your range size here. You can also derive it based on Environment.ProcessorCount, if you so wish */), 
     (range, loopState) => { 
      long product = 1; 
      for (int i = range.Item1; i < range.Item2; i++) { 
       product *= i; 
      } 
      results.Add(product); 
     }); 

    long factorial = 1; 
    foreach (var item in results) 
     factorial *= item; 
    return factorial; 
} 
関連する問題