프라임 계수 목록을 만들기위한 함수를 작성하려고합니다. 이를 위해 - 재귀 함수를 사용하고 있습니다. -이 목록을 수정함수가 전달 된 인수를 수정하지 않을 때
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 함수는 올바르게 작동하지만 전달 된 인수를 수정하면 안됩니다. 관련되지 않습니다.
매우 이상한 경우이지만 일부 목록 속성에 대한 정보가 누락되었습니다.
코드를 그대로 사용하면 무한 재귀가 발생합니다. –
비 기본 유형은 복사되지 않습니다. copy에 대해 작업하고 싶다면'List local = new List (_primefactors);을 호출하여 전달 된 참조에서 지역 목록을 생성하는 것이 바람직합니다. –
@OndrejTucny 동의하지 않음 - 코드가 infinte 루프에 빠지지 않습니다. –