以下のコードは、素数のリストを作成し、次の可能性のある素数がリスト内の任意の素数で割り切れるかどうかを調べることによって、number
以下のすべての素数を見つけます。IEnumerableを返すときに、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のSieveをチェックしてください:http://en.wikipedia.org/wiki/Sieve_of_Sundaram – SimpleVar
また、Sieve of Eratosthenesに行くことで改善することができます:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes Atkinの篩:http://en.wikipedia.org/wiki/Sieve_of_Antkin私は素数を生成するために今日知られている最も速い方法の一つであると考えています(最速でないにしても)。また、擬似コードがwikiにあります開始しました。 – SimpleVar
@YoryeNathanウィキペディアにこれらの篩があるのを見ましたが、もしこのコードをどこか重要なところに置くつもりなら、おそらく私はそれらを使うでしょう。このコードは、「利回りリターン」の考え方をどのように考えるかを訓練するのに役立ちました。 –