ich aus den folgenden Collatz Conjecture Algorithmus konvertieren Ich versuche:Parallel.For in C#
public class CollatzConjexture
{
public static int Calculate(int StartIndex, int MaxSequence)
{
int ChainLength = 0;
int key = 0;
bool ContinuteCalulating = true;
int LongestChain = 0;
Int64 Remainder = 0;
for (int i = StartIndex; i <= MaxSequence; i++)
{
ChainLength = 1;
Remainder = i;
ContinuteCalulating = true;
while (ContinuteCalulating)
{
Remainder = CalculateCollatzConjecture(Remainder);
if (Remainder == 1)
ContinuteCalulating = false;
ChainLength += 1;
}
if (ChainLength > LongestChain)
{
LongestChain = ChainLength;
key = i;
}
}
return key;
}
private static Int64 CalculateCollatzConjecture(Int64 Number)
{
if (Number % 2 == 0)
return Number/2;
else
return (3 * Number) + 1;
}
}
statt, um das .NET 4.0 Parallel.For zu verwenden:
int ChainLength = 0;
int key = 0;
bool ContinuteCalulating = true;
int LongestChain = 0;
Int64 Remainder = 0;
int[] nums = Enumerable.Range(1, 1500000).ToArray();
long total = 0;
// Use type parameter to make subtotal a long, not an int
Parallel.For<int>(1, nums.Length,() => 1, (j, loop, subtotal) =>
{
Remainder = j;
while (ContinuteCalulating)
{
Remainder = CalculateCollatzConjecture(Remainder);
if (Remainder == 1)
ContinuteCalulating = false;
ChainLength += 1;
}
if (ChainLength > LongestChain)
{
LongestChain = ChainLength;
key = j;
}
return key;
},
(x) => Interlocked.Add(ref key, x)
);
ich das Gefühl, ich habe Ich bin nicht zu weit davon entfernt, berühmte letzte Worte.
Vielen Dank im Voraus.
Wenn ich dies ausführen, bekomme ich nicht unbedingt den kleinsten Index, der die längste Collatz-Kette ergibt (dh für 1 bis 1500000 gibt die serielle Methode 1117065 und die LINQ-Methode 1126015, die beide eine Kettenlänge von 528 haben). Da ich gerade LINQ lerne, gibt es eine einfache Möglichkeit, den '.Aggregate'-Aufruf zu ändern, um das zu beheben? – chezy525
Ich bekomme beide Antworten, irgendwie, wenn ich debuggen bekomme ich (1117065, 1126015) bei verschiedenen Gelegenheiten. Idealerweise hätte ich gerne den Mindestindex. Danke im Voraus. – Seany84
Nachdem ich damit ein wenig herumgespielt habe, denke ich, dass Sie nur die Bedingungserklärung im '.Aggregate' ändern müssen. d. h. 'max.len cur.key) ' –
chezy525