2012-10-22 15 views
7

Ho una domanda sui miei compiti a casa e ho bisogno di sapere come restituire l'ennesimo numero di sequenze di Fibonacci usando l'iterazione (non è consentita la ricorsione).Restituendo nth Fibonacci numerare la sequenza?

Ho bisogno di alcuni suggerimenti su come farlo, così posso capire meglio cosa sto facendo male. Esco in console nel mio program.cs, quindi è assente nel codice qui sotto.

// 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

si sta riutilizzando 'n'. Ciò rende la condizione del ciclo errata dopo la prima iterazione. – harold

+0

non dovresti modificare 'n' nel tuo ciclo for. – Shmiddty

+0

wow, mi sento stupido grazie, nuovo alla programmazione – user1766351

risposta

1

Penso che questo dovrebbe fare il trucco:

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

che rende fib (1) = 2. Penso che dovresti cambiare a a 0 ec = 1. In questo modo fib (0) = c = 1, fib (1) equivale ancora a 1 e fib (2) = 2, che credo sia la sequenza corretta – Nabou

+0

Perché no, quindi, basta iniziare io a 1? Ha già un problema con 0 e 1 – Shmiddty

+0

o dovrei iniziare da 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

Soluzione piacevole, ma l'OP ha detto che il programma dovrebbe utilizzare l'iterazione, quindi questo non si qualifica. Scusa ;-) – Emile

+0

@ Emile Lo so, l'ho postato per divertimento. –

+0

Inoltre, 'n2/sqrt5' sarà sempre <0,5, quindi puoi ometterlo e arrotondarlo. –

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


    } 

è possibile ottenere il numero n-esimo dal

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

jus t per un po 'di divertimento che si possa fare con una lista di Fibonacci infinito e alcune estensioni 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(); 
} 

Ottenere il numero ennesima sarebbe poi

Fibonacci().Nth(n); 
0

Questa è la soluzione per il vostro lavoro, si dovrebbe iniziare da 3 perché hai già numeri per f1 e f2 (primi due numeri). Si prega di notare che non ha senso ottenere il numero 0 di Fibonacci.

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; 

     }