2016-05-12 4 views
0
static IEnumerable<int> FibonacciByLength(int length) 
    { 
     if (length <= 1) 
      yield return 1; 
     else 
      yield return FibonacciByLength(length - 1).Last() + 
     FibonacciByLength(length - 2).Last(); 
    } 

だけでなく、それはすべての数値を返すようにしたいだけ最後の値を返しますが、私はそれがそれらのすべてを返すようにしたい。..C#は再帰とフィボナッチのIEnumerable <int>を取得..私はこのコードで、最後の1

+0

あなたは 'List'を使うことを考えればよいでしょう。次に、単にフィボナッチ数を「追加」することができます – Ian

+2

フィボナッチは単純な再帰を使うのはひどいアルゴリズムの教科書のようなものです。この問題を解決するには、反復的なアプローチが必要です。指数関数的ではなく、線形で複雑であり、コードは非常に単純です。 – Servy

+0

あなたの答えはイアンです、ありがとうございます。 –

答えて

0

あなたは、あなたのメソッドに渡すパラメータによって制限されていない場合、私はこの理由は、あなたが

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()のような複数の呼び出しがあるためです。最後の値を取得するために渡された長さまでシーケンス全体を再計算する必要があります。長さの値だけを渡すことができる場合、あなたは他の選択肢を持たず、指数的な数の呼び出しを行う必要があります。

+0

素晴らしいです。私はそれについても考えていましたが、私の新しいこと、理解するのは少し難しいですし、それ以上のことができ、int maxValueより小さいフィボナッチ数を計算するコードを書こうとします –

+0

限界まで値を返すように変更するのは難しい。 valuesCalcualtedSoFarのすべての使用を削除し、maxValuesの名前をmaxValueに変更できます。最後に近いif文では、nextValue Marc

+0

私はまったく同じことをしましたが、まだ明確ではない細部はほとんどありませんが、もっと練習が必要だと思います。もう一度ありがとう、これは私の最初の質問であり、私はあなたの時間のために非常にうれしいです。 –

2

static IEnumerable<int> FibonacciByLength(int length) 
{ 
    if (length == 1) yield return 1; 
    else if (length == 2) 
    { 
     yield return 1; 
     yield return 1; 
    } 
    else 
    { 
     foreach (var fib in FibonacciByLength(length - 1)) 
      yield return fib; 

     yield return FibonacciByLength(length - 1).Last() + FibonacciByLength(length - 2).Last(); 
    } 
} 

しかし、私はあなたが冗長な計算を避けるために、再帰を使用しないことをお勧めします:1よりも大きい

length場合はFibonacciByLength(length - 1)yield returnにすべての番号が必要です

static IEnumerable<int> FibonacciByLength(int length) 
{ 
    int a = 1; 
    int b = 0; 

    for (int i = 1; i <= length; i++) 
    { 
     int c = a + b; 

     a = b; 
     b = c; 

     yield return c; 
    } 
} 
+0

最初のソリューションは、再帰とenumerables –

+0

を使用しているように、迅速かつ完全な答えをありがとうございました、それは第二の方法は、に簡素化することができる –

+0

大きな助け:、 '静的IEnumerableを FibonacciByLength(int型の長さ){ \t \t int型のA = 1 b = 0; \t \t for(int i = 0; i

関連する問題