Project Euler に関するいくつかの質問に取り組んでおり、見つけた解決策を理解するための助けが必要です。
私の質問は次のとおりです。SkipWhileメソッド呼び出しでXが設定されているのはどこですか?? 実行時にコードを中断し、その時点までステップスルーすると、値が設定されていることがわかりません。それでも、コードは最後まで機能します。SkipWhile の定義を確認しましたが、呼び出しで渡される引数が 3 つのパラメーターのメソッド定義をどのように満たしているのか理解できないだけかもしれません。Math.Pow についても同じことが言えます - その X はどこで設定されているのですか!?
public long FindGreatestPrimeFactor(long factorGreaterThan, long number)
{
long upperBound = (long)Math.Ceiling(Math.Sqrt(number));
// find next factor of number
long nextFactor = Range(factorGreaterThan + 1, upperBound)
.SkipWhile(x => number % x > 0).FirstOrDefault();
// if no other factor was found, then the number must be prime
if (nextFactor == 0)
{
return number;
}
else
{
// find the multiplicity of the factor
long multiplicity = Enumerable.Range(1, Int32.MaxValue)
.TakeWhile(x => number % (long)Math.Pow(nextFactor, x) == 0)
.Last();
long quotient = number / (long)Math.Pow(nextFactor, multiplicity);
if (quotient == 1)
{
return nextFactor;
}
else
{
return FindGreatestPrimeFactor(nextFactor, quotient);
}
}
}
private IEnumerable<long> Range(long first, long last)
{
for (long i = first; i <= last; i++)
{
yield return i;
}
}