2016-10-25 2 views
-2

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.

+2

Der Code, wie er ist, würde zu unendlicher Rekursion führen. –

+1

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);' –

+0

@OndrejTucny stimme nicht zu - Code fällt nicht in Infinte-Schleife. –

Antwort

1

An object is a reference type. Alle Variablen, die als reference type eingegeben werden, enthalten den Wert nicht; Sie enthalten jeweils einen Verweis oder Zeiger auf den Wert (oder das Objekt). Dies gilt auch dann, wenn die Variable als Parameter übergeben wird.

Die Funktion, die den Objektparameter empfängt, kann die Variable selbst nicht ändern (die wiederum nur ein Zeiger ist). Dies bedeutet, dass die Variable nicht auf eine andere Stelle verweisen kann. Es kann jedoch den Zeiger verwenden, um eine Referenz auf das Objekt und modify the object itself zu erhalten.

Wenn Sie ein Objekt übergeben möchten, aber absolut sicher gehen wollen, dass es nicht geändert wird, können Sie eine clone of it übergeben.

Verwandte Themen