1

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;
        }
    }
4

3 に答える 3

2

ラムダ式について話していると思います:

x => number % x > 0

すべてのラムダ式はラムダ演算子 => を使用します。これは「go to」と読みます。ラムダ演算子の左側は入力パラメーター (存在する場合) を指定し、右側は式またはステートメント ブロックを保持します。

LINQ 式では、各項目が反復処理されると、ラムダに渡されます。ラムダの本体で、項目を参照したい場合は、名前を付ける必要があります。この場合、パラメータは という名前になりxます。

于 2012-05-16T19:08:10.487 に答える
2

次のような式:

x => number % x > 0

ラムダ式と呼ばれます。それらは実際には関数でありx、パラメーターです。SkipWhile関数を受け取り、そのパラメーターに異なる値を指定して実行します。

ラムダ式を関数として記述する方法は次のとおりです。

bool Foobar(long x)
{
    return number % x > 0;
}

ではSkipWhile、関数はxリストの最初の項目で呼び出されると思います。true の場合、関数はリストの 2 番目の項目で再度呼び出され、関数が false を返すまで同様に呼び出されます。

この場合、SkipWhileはリスト内の型の値を に変換する関数を要求していますbool。ラムダ式は、これを簡潔に表現する方法です。

于 2012-05-16T19:09:04.030 に答える
0

SkipWhilexは、メソッドから入力値 ( ) を取得しています。メソッドは、 からまでのRange数値を返します。これはメソッドに組み込まれているため、作成者がこのためのメソッドを作成することにした理由はわかりません。factorGreaterThan + 1upperBoundEnumerable.Range

于 2012-05-16T19:07:45.407 に答える