我的代码如下,通过创建素数列表并检查下列潜在素数是否可以被列表中的任何素数均匀整除,从而找到所有素数在number
以下的素数。您是否可以访问IEnumerable,因为您正在返回它?
我在努力学习yield return
的来龙去脉。现在我有一个List<int> primes
,我在函数内使用。但我通过yield return
返回相同的数据。所以我的问题是
我可以从函数内部访问IEnumerable < int>,因为我正在创建它?所以我可以删除列表< int>素数。
/// <summary>
/// Finds all primes below <paramref name="number"/>
/// </summary>
/// <param name="number">The number to stop at</param>
/// <returns>All primes below <paramref name="number"/></returns>
private static IEnumerable<long> PrimeNumbers(long number)
{
yield return 2;
List<long> primes = new List<long>(2);
for(long num = 3; num < number; num += 2)
{
//if any prime lower then num divides evenly into num, it isn't a prime
//what I'm doing now
if(!primes.TakeWhile(x => x < num).Any(x => num % x == 0))
{
primes.Add(num);
yield return num;
}
//made-up syntax for what I'd like to do
if(!this.IEnumerable<long>
.TakeWhile(x => x < num).Any(x => num % x == 0))
{
yield return num;
}
}
}
简答题:不会。长答案:有更好的方法可以让素数达到某个数。检查Sundaram的筛网:http://en.wikipedia.org/wiki/Sieve_of_Sundaram – SimpleVar 2012-04-21 03:44:51
您也可以通过参考Eratosthenes筛选来改进:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes,甚至更多Atkin的筛选器:http://en.wikipedia.org/wiki/Sieve_of_Atkin我认为这是目前已知的用于生成素数(如果不是最快的)的最快方法之一,并且wiki中还有伪代码来帮助您获得开始。 – SimpleVar 2012-04-21 03:47:51
@YoryeNathan我在维基百科上看到了这些筛子,如果我将这些代码保留在任何重要的地方,我可能会使用它们。这段代码更有助于培养自己如何思考“收益回报”的思维方式。 – 2012-04-21 03:49:58