2010-12-30 6 views
0
public int Fibonacci(int x) 
{   
    int prev = -1; 
    int next = 1; 
    for (int i = 0; i < x; i++) 
    { 
     int sum = prev + next; 
     prev = next; 
     next = sum; 
     Console.WriteLine(sum); 
    } 
    return sum; // plz teel me how can i return whole list ?? 
} 

Wie kann ich die gesamte Ausgabe der oben genannten Serie zurückgeben? d.h. wenn x = 3, dann 0 1 1 2, also wie kann ich es zurückgeben?Wie kann ich eine Fibonacci-Serie zurückgeben? Sollte ich IList <> verwenden?

+0

Array, out-Parameter, ref Parameter, benutzerdefiniertes Objekt - jeder – pavanred

+0

Ich zähle die Minuten, bis die erste mit einer C# Version des berühmten Haskell eines aufkommt: 'fibs = 0: 1: zipWith (+) fibs (Schwanzfibeln) '. Oder in Scala: 'lazy val fibs: Streamen [BigInt] = 0 # :: 1 # :: fibs.zip (fibs.tail) .map {case (a, b) => a + b}'. –

+0

Jörg W Mittag: dieser Code ist Hollywood-Material, aber das wird nicht immer noch zu übertreffen sein: http://stackoverflow.com/questions/1995113/sci-fi-action-movie-programming-language/2003939# 2003939 –

Antwort

13

Versuchen Sie folgendes:

public IEnumerable<int> Fibonacci(int x) 
{ 
    int prev = -1; 
    int next = 1; 
    for (int i = 0; i < x; i++) 
    { 
     int sum = prev + next; 
     prev = next; 
     next = sum; 
     yield return sum; 
    } 
} 
+0

+1 für faule Auswertung. – Oded

+0

+1 Ich muss lernen, schneller zu tippen :) –

+1

+1 für die einzige Antwort, die nicht die gleiche ist wie die anderen (und auch richtig) – rownage

3

Dies wird die ganze Liste berechnen und sendet es nach (eifrig Auswertung) Fertigstellung:

public IEnumerable<int> Fibonacci(int x) 
{ 

    IList<int> fibs = new List<int>() 

    int prev = -1; 
    int next = 1; 
    for (int i = 0; i < x; i++) 
    { 
    int sum = prev + next; 
     prev = next; 
     next = sum; 
     fibs.Add(sum); 
    } 

    return fibs; 
} 

Dieser wird jedes Element berechnet und zurück, wie es gebraucht wird (lazy evaluation), mit yield:

public IEnumerable<int> Fibonacci(int x) 
{ 
    int prev = -1; 
    int next = 1; 
    for (int i = 0; i < x; i++) 
    { 
    int sum = prev + next; 
     prev = next; 
     next = sum; 
     yield return sum; 
    } 
} 
+0

+1 für die Belichtung nur 'IEnumerable '. Eine Sequenz ist keine Liste. –

0

Sie kehren eins nach dem ... retur ning eins. Es ist nicht kompliziert.

public IList<int> Fibonacci(int x) 
{ 
    List<int> result = new List<int>(); 

    int prev = -1; 
    int next = 1; 
    for (int i = 0; i < x; i++) 
    { 
    int sum = prev + next; 
     prev = next; 
     next = sum; 
     result.Add(sum); 
    } 

    return result; 
} 
0

Wenn Sie eine Liste oder ein Array von all ihre Zahlen zurückkehren wollen, würden Sie brauchen nur etwas wie folgt aus:

public List<int> Fibonacci(int x) 
{ 
    List<int> returnList = new List<int>(); 

    int prev = -1; 
    int next = 1; 
    for (int i = 0; i < x; i++) 
    { 
     int sum = prev + next; 
     prev = next; 
     next = sum; 
     returnList.Add(sum); 
    } 
    return returnList; 
} 
0

ich von Andrew Hares verzögertes Laden Fibonacci inspiriert bin neu zu schreiben meine Fibonacci vor http://www.ienablemuch.com/2010/09/fibonacci-using-sql.html zu träges Laden Ansatz:

using System; 
using System.Collections.Generic; 

using System.Linq; 

namespace Fibonacci 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine("Sans list. Lazy load stuff:"); 
      int i = 0; 


      foreach(int n in Fibonacci().Take(10)) 
      { 
       ++i; 
       Console.WriteLine("Loading {0} {1}", i, n);    
      } 


      Console.WriteLine("\nPick the 20th fibonacci:"); 
      Console.WriteLine("\n20th fibonacci: {0}", 
       Fibonacci().Skip(20 - 1).Take(1).Single()); 


      Console.WriteLine("\nEagerly load everything in list:"); 
      i = 0;  
      foreach(int n in Fibonacci().Take(10).ToList()) 
      { 
       ++i; 
       Console.Write("\nEager loading {0} {1}", i, n); 
      } 

     } 



     static IEnumerable<int> Fibonacci() 
     { 
     int a = 0, b = 1; 

     for(;;) 
     { 
      Console.Write("Lazy");   
      yield return a; 
      int n = a; 
      a += b; 
      b = n;   
     } 


     } 
    }//class 

} 

Ausgang:

Sans list. Lazy load stuff: 
LazyLoading 1 0 
LazyLoading 2 1 
LazyLoading 3 1 
LazyLoading 4 2 
LazyLoading 5 3 
LazyLoading 6 5 
LazyLoading 7 8 
LazyLoading 8 13 
LazyLoading 9 21 
LazyLoading 10 34 

Pick the 20th fibonacci: 
LazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazyLazy 
20th fibonacci: 4181 

Eagerly load everything in list: 
LazyLazyLazyLazyLazyLazyLazyLazyLazyLazy 
Eager loading 1 0 
Eager loading 2 1 
Eager loading 3 1 
Eager loading 4 2 
Eager loading 5 3 
Eager loading 6 5 
Eager loading 7 8 
Eager loading 8 13 
Eager loading 9 21 
Eager loading 10 34 

Wenigstens diese Lösung von anderen :-) dies unterscheidet sich nicht mit -1 beginnen, kann man unsigned int anstelle von int

0
  int n = 15; 
      string r = string.Empty; 
      int s=0, t=1,u; 
      for (int i = 0; i < n; i++) 
      { 
       if (i == 0) 
       {     
        r += Convert.ToString(s)+Convert.ToString(t); 
       } 
       else 
       { 
        u = s + t; 
        s = t; 
        t = u; 
        r += Convert.ToString(u);           
       } 
      } 
      MessageBox.Show(r); 
0

sollte ich sagen, dass erste Antwort genug ist, aber wenn Sie groß haben Zahlen, Sie werden mit int überlaufen. Versuchen Sie stattdessen, ulong zu verwenden; Wir müssen das aktualisieren, um -1 nicht auf prev zu verwenden, da Sie keine Negative verwenden können. Stattdessen können Sie dieses versuchen:

public static IEnumerable<ulong> Generate(ulong n) 
    { 
     if (n < 1) yield break; 
     yield return 1; 
     ulong prev = 0; 
     ulong next = 1; 

     for (ulong i = 1; i < n; i++) 
     { 
      ulong sum = prev + next; 
      prev = next; 
      next = sum; 
      yield return sum; 
     } 
    } 

wo für die erste Zahl gibt 1 zurück, und mehr als das die Fibonacci mit vorheriger Berechnung Rückkehr positive Zahlen auf ulong Format macht.

0
static IEnumerable<int> Fibonacci(int n) 
    { 
     int a = 0, b = 1; 
     yield return a; 
     yield return b; 
     for (int i = 0; i < n; i++) 
     { 
      yield return a = a + b; 
      yield return b = b + a; 
     } 
    } 
Verwandte Themen