2017-03-11 3 views
0

Ich bin auf der Suche nach einer Möglichkeit zur Verwendung der Task zur Berechnung der Fakultät einer Zahl. Mein Zweck ist es, das Ergebnis mit faktoriell mit einer sequentiellen Schleife zu vergleichen. Zum Beispiel 16! task1 = 16 * 15 * 14 * 13 * 12 * 11 und task2 = 10 * 9 * 8 * 7 * 6 und task3 = 5 * 4 * 3 * 2 * 1 Ich habe online gesucht, aber ich kann keine passende Lösung finden mein Bedürfnis. Danke im Voraus.Factorial mit Task

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

Warum möchten Sie Aufgaben verwenden? Wie Ihr Beispiel zeigt, können Sie mit den Grundlagen beginnen. Ich empfehle Ihnen, dies zu lesen: [Task-basierte asynchrone Programmierung] (https://msdn.microsoft.com/en-us/library/dd537609 (v = vs.110) .aspx) Dann weißt du, wo ich anfangen soll. –

Antwort

1

Ein einfachste Weg parallel zu versuchen, wenn faktorielle Berechnung ist PLINQ (Parallel 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); 
    } 

Verwenden Stopwatch Benchmark; auskommentieren .AsParallel(): wollen Sie wirklich parallele Implementierung (lassen Task allein)?

+0

Ja. Ich möchte eine parallele Implementierung. Eine beliebige Anzahl in drei Segmente aufteilen und parallel ablaufen lassen. Ich möchte das Ergebnis mit der normalen faktoriellen Berechnung vergleichen, wie im obigen Code gezeigt. Vielen Dank. – Awani

0

Sie können @ DmitryBychenko Antwort verwenden, wenn Sie PLINQ Weg gehen möchten. Alternativ können Sie aber auch direkt die Parallel-Bibliothek verwenden. Wenn Sie buchstäblich versuchen, Ihr angegebenes Problem mit Hilfe der Task-Bibliothek zu lösen, denke ich, dass PLINQ eine sauberere Lösung ist. Wenn Sie jedoch die gepostete Frage als reduzierte Version eines ähnlichen Problems verwenden, wo Sie mehr Kontrolle benötigen, könnte die folgende Lösung funktionieren Hilfe

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; 
}