2016-05-15 9 views
-2

Ich habe auf diesem Link ähnliche Lösung Java: check if arraylist is part of fibonacci sequence gefunden, aber ich will das in C#. Ich tray, um das in C# zu konvertieren, aber es funktioniert nicht. Kann mir jemand helfen und mir sagen, wo ich falsch liege?Überprüfen Sie, ob Arraylist Teil der Fibonacci-Sequenz ist C#

static void Main(string[] args) 
    { 
     List<int> list = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13, 21 }; 
     Console.WriteLine(isFibonacci(list)); 
     Console.ReadLine(); 
    } 
public static bool isFibonacci(List<int> arr) 
    { 

     if (arr.Count() < 3) 
     { 
      return false; 
     } 

     int fib1 = 0; 
     int fib2 = 1; 

     while (fib1 < arr.IndexOf(0)) 
     { 
      int tmp = fib1 + fib2; 
      fib1 = fib2; 
      fib2 = tmp; 
     } 

     if (fib1 != arr.IndexOf(0)) 
     { 
      return false; 
     } 

     if (fib2 != arr.IndexOf(1)) 
     { 
      return false; 
     } 

     for (int i = 2; i < arr.Count(); i++) 
     { 
      if (arr.IndexOf(i) < 0) 
       return false; 

      // I think that problem is in this part of code 
      if (arr.IndexOf(i) != (arr.IndexOf(i - 1) + arr.IndexOf(i - 2))) 
       return false; 
     } 
     return true; 
    } 
+1

Der Code auf den ersten Blick richtig zu sein scheint. Was bedeutet "nicht funktioniert" genau? –

+0

Können Sie sagen, für welchen Wert Ihr Code falsch zurückgibt? – PhillipH

+0

Ich habe einen Kommentar in Code, wo ich denke, ist ein Fehler. – Milos

Antwort

1

Die List.IndexOf Methode gibt den Index des Elements als Argument angegeben: https://msdn.microsoft.com/en-us/library/e4w08k17%28v=vs.110%29.aspx

Haben Sie eher nicht das Element am angegebenen Index erhalten mögen, die arr [i] sein würde?

Aktualisiert Quellcode:

static void Main(string[] args) 
    { 
     List<int> list = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13, 21 }; 
     Console.WriteLine(isFibonacci(list)); 
     Console.ReadLine(); 
    } 

    public static bool isFibonacci(List<int> arr) 
    { 

     if (arr.Count() < 3) 
     { 
      return false; 
     } 

     int fib1 = 0; 
     int fib2 = 1; 

     while (fib1 < arr[0]) 
     { 
      int tmp = fib1 + fib2; 
      fib1 = fib2; 
      fib2 = tmp; 
     } 

     if (fib1 != arr[0]) 
     { 
      return false; 
     } 

     if (fib2 != arr[1]) 
     { 
      return false; 
     } 

     for (int i = 2; i < arr.Count(); i++) 
     { 
      if (arr[i] < 0) 
       return false; 

      // I think that problem is in this part of code 
      if (arr[i] != (arr[i - 1] + arr[i - 2])) 
       return false; 
     } 
     return true; 
    } 
+0

Er könnte '[]' anstelle von 'IndexOf()' verwenden, aber wie würde das das Problem lösen? –

+0

In C# sind ein Indexer '[]' und 'IndexOf()' Methoden nicht gleichwertig. Das Äquivalent zu einem Indexer ist 'ElementAt()'. –

+0

Oh mein Gott, du hast Recht! Ich habe dieses IndexOf so oft in diesem Code gelesen, aber es hat mich nicht getroffen. Meine Antwort ist also wahrscheinlich völlig falsch. –

0

Dies ist keine direkte Antwort auf die Frage. Ich dachte nur, es würde Spaß machen, das in LINQ zu machen.

Sie können es auf diese Weise tun:

public static bool isFibonacci(List<int> arr) 
{ 
    return 
     arr 
      .Zip(
       arr.Skip(1), 
       (x0, x1) => new { x0, x1 }) 
      .Zip(
       arr.Skip(2), 
       (x01, x2) => x01.x0 + x01.x1 - x2 == 0) 
      .All(x => x); 
} 

Oder diese mit den Interactive Extensions (NuGet "Ix-Main"):

public static bool isFibonacci(List<int> arr) 
{ 
    return arr.Buffer(3, 1).Where(x => x.Count == 3).All(x => x[0] + x[1] == x[2]); 
} 
Verwandte Themen