我正在尝试编写一个用于创建素因子列表的函数。为此 - 我正在使用递归函数。 以下是电话:
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;
}
}
}
问题在于,当我调用具有bool返回类型的CheckIfIntIsPrime(List,i)时,它会修改List。这意味着,在检查之后 - 传递给GeneratePrimeFactorsList(int)的参数在每次while循环迭代后变为空。
CheckIfPrime函数可以正常工作,但修改传递的参数,当它不应该 - 我不相关它们。
非常奇怪的情况,但我觉得,我错过了一些List属性的知识。
答案 0 :(得分:1)
An object is a reference type。输入为reference type的所有变量都不包含值本身;它们每个都包含一个引用或指向值(或对象)的指针。即使将变量作为参数传递,也是如此。
接收object参数的函数不能修改变量本身(同样,它只是一个指针)。这意味着它不能使变量指向其他位置。但是,它可以使用指针来获取对象的引用和modify the object itself。
如果您想传递一个对象,但又想确保它没有被修改,您可以传递一个clone of it。