Ich versuche, eine Funktion zum Erstellen einer Primfaktorenliste zu schreiben. Dazu verwende ich eine rekursive Funktion. Hier sind die Anrufe:Funktion ändert das übergebene Argument, wenn es nicht sollte
private int Problem003()
{
//The prime factors of 13195 are 5, 7, 13 and 29.
//What is the largest prime factor of the number 600851475143 ?
return GeneratePrimeFactorsList(15).Last();
}
private List<int> GeneratePrimeFactorsList(int n)
{
List<int> _primefactors = new List<int>();
_primefactors.Add(2);
int i = 3;
while(i <= n)
{
if (CheckIfIntIsPrime(_primefactors, i))
{
_primefactors.Add(i);
}
i=i+2;
}
return _primefactors;
}
private bool CheckIfIntIsPrime(List<int> _primefactors, int i)
{
if (_primefactors.Count() == 0)
{
return true;
}
else
{
if(i % _primefactors.First() != 0)
{
_primefactors.Remove(_primefactors.First());
return CheckIfIntIsPrime(_primefactors, i);
}
else
{
return false;
}
}
}
Das Problem ist, dass, wenn ich für CheckIfIntIsPrime (List, i) nenne, die haben bool Rückgabetyp - es die Liste ändert. Das bedeutet, dass nach der Prüfung - das übergebene Argument in die GeneratePrimeFactorsList (int) nach jeder while-Schleife-Iteration leer wird.
Die CheckIfPrime-Funktion funktioniert ordnungsgemäß, aber ändert das übergebene Argument, wenn es nicht sollte - ich habe sie nicht beziehen.
Sehr seltsame Fall, aber ich fühle, dass ich das Wissen über einige der List-Eigenschaften fehlt.
Der Code, wie er ist, würde zu unendlicher Rekursion führen. –
Nicht primitive Typen werden nicht kopiert. Wenn Sie an der Kopie arbeiten möchten, erstellen Sie vorzugsweise lokale Liste von übergebenen Referenz durch Aufrufen von "Liste local = neue Liste (_primefactors);' –
@OndrejTucny stimme nicht zu - Code fällt nicht in Infinte-Schleife. –