2016-10-25 3 views
-2

프라임 계수 목록을 만들기위한 함수를 작성하려고합니다. 이를 위해 - 재귀 함수를 사용하고 있습니다. -이 목록을 수정함수가 전달 된 인수를 수정하지 않을 때

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

문제는 내가 CheckIfIntIsPrime 위해 (목록, i)를 호출하고 때, 부울 반환 형식이있는 점이다 : 다음은 전화입니다. 즉, 검사가 끝나면 GeneratePrimeFactorsList (int)에 전달 된 인수가 루프 반복 동안 각각 비어있게됩니다.

CheckIfPrime 함수는 올바르게 작동하지만 전달 된 인수를 수정하면 안됩니다. 관련되지 않습니다.

매우 이상한 경우이지만 일부 목록 속성에 대한 정보가 누락되었습니다.

+2

코드를 그대로 사용하면 무한 재귀가 발생합니다. –

+1

비 기본 유형은 복사되지 않습니다. copy에 대해 작업하고 싶다면'List local = new List (_primefactors);을 호출하여 전달 된 참조에서 지역 목록을 생성하는 것이 바람직합니다. –

+0

@OndrejTucny 동의하지 않음 - 코드가 infinte 루프에 빠지지 않습니다. –

답변

1

An object is a reference type. reference type으로 입력 된 모든 변수에는 값 자체가 들어 있지 않습니다. 그들은 각각 값 (또는 객체)에 대한 참조 또는 포인터를 포함합니다. 변수가 매개 변수로 전달되는 경우에도 마찬가지입니다.

개체 매개 변수를받는 함수는 변수 자체를 수정할 수 없습니다 (다시 포인터는 포인터 임). 즉, 변수가 다른 곳을 가리킬 수 없습니다. 그러나 포인터를 사용하여 객체에 대한 참조를 가져올 수 있으며 modify the object itself입니다.

개체를 전달하려고하지만 수정되지 않았 음을 확실히 알고 싶으면 clone of it을 전달하면됩니다.

관련 문제