3

私はLINQと関連するテーマで遊んでいて、次のことについて疑問に思っていました。

フィボナッチ数列を取得する方法は2つあります。私は始めました:

public static IEnumerable<int> Fibonacci
    {
        get
        {
            int i = 0;
            int j = 1;
            int temp = 0;

            while (true)
            {
                yield return i;

                temp = i;
                i = j;
                j = temp + i;
            }
        }
    }  

しかし、それは私に考えさせられました、なぜ私はこれを選ぶのでしょうか:

public static IList<int> Fibonacci(long to)
    {            
        IList<int> fibList = new List<int>();
        int i = 0;
        int j = 1;
        int temp, index = 0;

        while (index < to)
        {
            fibList.Add(i);

            temp = i;
            i = j;
            j = temp + i;

            index++;
        }
        return fibList;
    }

IListも列挙可能です+パラメータ化を追加したい場合があります。数値が急速に大きくなるため、最適化やuse <long>のようなものを実際に探しているわけではありません。これは、単なる簡単な例です。いくつかの引数は、各メソッドの賛否両論です。なぜ、いつどの方法を使用する必要がありますか?

4

3 に答える 3

4

2つの重要な違いは、2番目のバージョンでは、いつ停止するかを事前に知っておく必要があることですが、最初のバージョンでは、反復を開始し、後でいつ停止するかを決定できます。事前に知る必要はありません。

また、最初のバージョンでは、リスト全体を一度にメモリに保存する必要はありません。ストリーミング方式でデータを処理できます。

2番目の利点は、リストを返すことで、要素を最初から1つずつ処理するのではなく、配列にインデックスを付けることができることです。必要な要素の数がわかっていて、リストがメモリに収まるほど小さいことがわかっている場合は、2番目のバージョンを使用できます。

これらの違いは、プロパティまたは関数呼び出しのどちらを使用するかとは関係がないことに注意してください。最初のものを、パラメーターをとらない関数呼び出しに書き直すことができます。

最初のバージョンしか利用できない場合は、を使用して2番目のバージョンを簡単にエミュレートできますFibinocci().Take(20).ToList()

于 2010-01-23T15:41:20.880 に答える
0

なぜプロパティを使用するのですか(静的またはその他)。フィボナッチ数の生成は何の特性です...?また、経験則として、プロパティは「重要な」計算/処理を実行してはならないため、ここで関数を使用する必要があります。

于 2010-01-23T15:38:09.813 に答える
0

あなたが最初のバージョンをに入れた場合、foreachあなたが特にブレークアウトしない限り、それは決して終了しません。使用時のバグの潜在的な原因。たぶんそれはあなたが望むものですが、それは用心すべきことです。

于 2010-01-23T15:40:21.473 に答える