あなたは、あなたのメソッドに渡すパラメータによって制限されていない場合、私はこの理由は、あなたが
var values = FibonacciByLength(10).ToList();
を使用して呼び出すと、次の
static IEnumerable<int> FibonacciByLength(int maxValues, int valuesCalculatedSoFar = 0, int previousValue1 = 0, int previousValue2 = 0)
{
int nextValue;
if (valuesCalculatedSoFar < 2)
{
nextValue = 1;
}
else
{
nextValue = previousValue1 + previousValue2;
}
yield return nextValue;
valuesCalculatedSoFar++;
if (valuesCalculatedSoFar < maxValues)
{
foreach(var value in FibonacciByLength(maxValues, valuesCalculatedSoFar, previousValue2, nextValue))
{
yield return value;
}
}
}
であることをお勧め不要な呼び出しを避けることができます。このメソッドを使用すると、フィボナッチシーケンスの最初の10個の値を計算したい場合は、FibonacciByLengthを10回呼び出すだけです。 FibonacciByLengthを呼び出すたびに、次の値を計算するために必要な値を渡すので、再計算する必要はありません。
Arturoによって提案された方法を使用すると、メソッドを2089回呼び出すことになります。これは、FibonacciByLength(length-1).Last()のような複数の呼び出しがあるためです。最後の値を取得するために渡された長さまでシーケンス全体を再計算する必要があります。長さの値だけを渡すことができる場合、あなたは他の選択肢を持たず、指数的な数の呼び出しを行う必要があります。
あなたは 'List'を使うことを考えればよいでしょう。次に、単にフィボナッチ数を「追加」することができます – Ian
フィボナッチは単純な再帰を使うのはひどいアルゴリズムの教科書のようなものです。この問題を解決するには、反復的なアプローチが必要です。指数関数的ではなく、線形で複雑であり、コードは非常に単純です。 – Servy
あなたの答えはイアンです、ありがとうございます。 –