函数不应该修改传递的参数
本文关键字:参数 不应该 修改 函数 | 更新日期: 2023-09-27 18:14:57
我正在尝试编写一个用于创建素数因子列表的函数。我用的是递归函数。以下是呼叫:
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(List, I)时,它具有bool返回类型-它修改了List。这意味着,在检查之后,传入GeneratePrimeFactorsList(int)的参数在每次while循环迭代后都变为空。
CheckIfPrime函数工作正常,但修改了传递的参数,当它不应该-我不关联它们。
非常奇怪的情况,但我觉得,我错过了一些知识的列表属性
对象是引用类型。所有类型为引用类型的变量都不包含值本身;它们每个都包含指向值(或对象)的引用或指针。即使变量作为参数传递,也是如此。
接收对象形参的函数不能修改变量本身(同样,它只是一个指针)。这意味着它不能导致变量指向其他地方。但是,它可以使用指针获取对对象的引用并修改对象本身。
如果你想传递一个对象,但又想确保它不会被修改,你可以传递它的克隆。