我的代碼如下,通過創建素數列表並檢查下列潛在素數是否可以被列表中的任何素數均勻整除,從而找到所有素數在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