2012-10-22 7 views
7

私はクラスについて宿題について質問があり、繰り返しを使ってn番目のフィボナッチ数を返す方法を知る必要があります(再帰は許されません)。N番目のフィボナッチを返すと、シーケンスに番号が付けられますか?

これを行う方法についてのヒントが必要なので、間違っていることをよりよく理解することができます。私はprogram.csの中のコンソールに出力します。したがって、以下のコードにはありません。

私は、これはトリックを行うべきだと思う
// Q1) 
    // 
    // Return the Nth Fibonacci number in the sequence 
    // 
    // Input: uint n (which number to get) 
    // Output: The nth fibonacci number 
    // 

    public static UInt64 GetNthFibonacciNumber(uint n) 
    { 

    // Return the nth fibonacci number based on n. 


    if (n == 0 || n == 1) 
     { 
      return 1; 
     } 

     // The basic Fibonacci sequence is 
     // 1, 1, 2, 3, 5, 8, 13, 21, 34... 
     // f(0) = 1 
     // f(1) = 1 
     // f(n) = f(n-1) + f(n-2) 
     /////////////// 
     //my code is below this comment 

     uint a = 0; 
     uint b = 1; 

     for (uint i = 0; i < n; i++) 
     { 
      n = b + a; 
      a = b; 
      b = n; 
     } 
     return n; 
+8

あなたは 'N'を再利用しています。これは、最初の反復後にループ条件を間違ってしまいます。 – harold

+0

あなたのforループで 'n'を変更するべきではありません。 – Shmiddty

+0

うわー私は愚か者だと思う男、プログラマブルなことに感謝 – user1766351

答えて

1

uint a = 0; 
    uint b = 1; 
    uint c = 1; 

    for (uint i = 0; i < n; i++) 
    { 
     c = b + a; 
     a = b; 
     b = c; 
    } 
    return c; 
+0

はfib(1)= 2にします。私はあなたが0とc = 1に変更すべきだと思います。そのようにしてfib(0)= c = 1、fib(1)はまだ1になり、fib(2)= 2は正しいシーケンスであると確信しています – Nabou

+0

なぜ私は1で始めるのですか?彼はすでに0と1のキャッチを持っています – Shmiddty

+0

または私は2で始める必要がありますか? – Shmiddty

7

:)

static ulong Fib(int n) 
{ 
    double sqrt5 = Math.Sqrt(5); 
    double p1 = (1 + sqrt5)/2; 
    double p2 = -1 * (p1 - 1); 


    double n1 = Math.Pow(p1, n + 1); 
    double n2 = Math.Pow(p2, n + 1); 
    return (ulong)((n1 - n2)/sqrt5); 
} 
+0

良い解決策ですが、OPはプログラムが反復を使用するべきだと言いました。申し訳ありません;-) – Emile

+0

@エミール私は知っている、私は楽しくこれを投稿しました。 –

+0

さらに、 'n2/sqrt5'は常に<0.5なので、省略して丸めることができます。 –

0
public IEnumerable<BigInteger> FibonacciBig(int maxn) 
    { 
     BigInteger Fn=1; 
     BigInteger Fn_1=1; 
     BigInteger Fn_2=1; 

     yield return Fn; 
     yield return Fn; 

     for (int i = 3; i < maxn; i++) 
     { 
      Fn = Fn_1 + Fn_2; 

      yield return Fn; 

      Fn_2 = Fn_1; 
      Fn_1 = Fn; 
     } 


    } 

あなたは

FibonacciBig(100000).Skip(n).First(); 
1

によりn番目の数を取得することができますジュス

Fibonacci().Nth(n); 
0

これはあなたの宿題のためのソリューションである、あなたが開始する必要がささやかな楽しみのためのtはあなたは次のようになり、無限のフィボナッチリストとn番目の数を取得するいくつかのIEnumerableを拡張

public IEnumerable<int> Fibonacci(){ 
    var current = 1; 
    var b = 0; 
    while(true){ 
     var next = current + b; 
     yield return next; 
     b = current; 
     current = next; 
    } 
} 

public T Nth<T>(this IEnumerable<T> seq, int n){ 
    return seq.Skip.(n-1).First(); 
} 

でそれを行うことができますあなたはすでにf1とf2(最初の2つの数字)の数字があるので、3から。フィボナッチ数を0にすることに意味がないことに注意してください。

public static UInt64 GetNthFibonacciNumber(uint n) 
    { 

    // Return the nth fibonacci number based on n. 


if (n == 1 || n == 2) 
    { 
     return 1; 
    } 


    uint a = 1; 
    uint b = 1; 
    uint c; 

    for (uint i = 3; i <= n; i++) 
    { 
     c = b + a; 
     a = b; 
     b = c; 
    } 
    return c; 

}

0
public static UInt64 GetNthFibonacciNumber(uint n) 
    { 
     if (n == 0 || n == 1) 
     { 
      return 1; 
     } 
     UInt64 a = 1, b = 1; 
     uint i = 2; 
     while (i <= n) 
     { 
      if (a > b) b += a; 
      else a += b; 
      ++i; 
     } 
     return (a > b) ? a : b; 
    } 
1
 public static int GetNthFibonacci(int n) 
    { 
     var previous = -1; 
     var current = 1; 
     int index = 1; 
     int element = 0; 

     while (index++ <= n) 
     { 
      element = previous + current; 
      previous = current; 
      current = element; 
     } 

     return element; 
    } 
0
public static List<int> PrintFibonacci(int number) 
     { 
      List<int> result = new List<int>(); 
      if (number == 0) 
      { 
       result.Add(0); 
       return result; 
      } 
      else if (number == 1) 
      { 
       result.Add(0); 
       return result; 
      } 
      else if (number == 2) 
      { 
       result.AddRange(new List<int>() { 0, 1 }); 
       return result; 
      } 
      else 
      { 
       //if we got thus far,we should have f1,f2 and f3 as fibonacci numbers 
       int f1 = 0, 
        f2 = 1; 

       result.AddRange(new List<int>() { f1, f2 }); 
       for (int i = 2; i < number; i++) 
       { 
        result.Add(result[i - 1] + result[i - 2]); 
       } 
      } 
      return result; 

     } 
関連する問題