2009-07-02 4 views
2

Я практикую консольное приложение C#, и я пытаюсь получить функцию, чтобы проверить, отображается ли номер в серии фибоначчи или нет, но я получаю ошибки.Функция возврата фибоначчи C#

Что я сделал:

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Console.WriteLine(isFibonacci(20)); 
    } 
    static int isFibonacci(int n) 
    { 
     int[] fib = new int[100]; 
     fib[0] = 1; 
     fib[1] = 1; 
     for (int i = 2; i <= 100; i++) 
     { 
      fib[i] = fib[i - 1] + fib[i - 2]; 

      if (n == fib[i]) 
      { 
       return 1; 
      } 



     } 
     return 0; 
    } 
} 

Может кто-нибудь сказать мне, что я делаю неправильно здесь?

+1

Определить «ошибки» ... –

+0

Возможно, вы имели в виду ошибки #DEFINE? – Jonathan

+2

Просто любопытно, но почему вы возвращаете int, а не bool? – Joel

ответ

5

А вот решение, которое бьет все твое!

Потому что, почему итерации, когда у вас есть умные математики делают решения закрытых форм для вас?:)

static bool IsFibonacci(int number) 
{ 
    //Uses a closed form solution for the fibonacci number calculation. 
    //http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression 

    double fi = (1 + Math.Sqrt(5))/2.0; //Golden ratio 
    int n = (int) Math.Floor(Math.Log(number * Math.Sqrt(5) + 0.5, fi)); //Find's the index (n) of the given number in the fibonacci sequence 

    int actualFibonacciNumber = (int)Math.Floor(Math.Pow(fi, n)/Math.Sqrt(5) + 0.5); //Finds the actual number corresponding to given index (n) 

    return actualFibonacciNumber == number; 
} 
4

Ну, для начала вашего массива только 10 долго и вы заполняете его с ~ 100 позиций (из-за границы диапазона-исключения) - но есть лучшие способы сделать это ...

для Например, с помощью this post:

long val = ... 
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val; 
+0

Ах, ты избил меня! – Joseph

+0

О, извините, ребята, мои плохие, это была типичная ошибка, но это не проблема ... – jarus

2

Одна вещь, которую вы можете сделать, это проверить на скорый выход. Поскольку вы пытаетесь определить, является ли заданное число в последовательности Фибоначчи, вы можете выполнить проверку границ, чтобы выйти раньше.

Пример:

static bool isFibonacci(int n) 
{ 
    int[] fib = new int[100]; 
    fib[0] = 1; 
    fib[1] = 1; 
    for (int i = 2; i <= fib.Length; i++) 
    { 
     fib[i] = fib[i - 1] + fib[i - 2]; 

     if (n == fib[i]) 
     { 
      return true; 
     } 
     else if (n < fib[i]) 
     { 
      return false; //your number has been surpassed in the fib seq 
     } 
    } 
    return false; 
} 
+1

Вероятно, должно быть исключение, если конец массива удовлетворен: функция не может дать ответ в этом случае. – Richard

2
int[] fib = new int[10]; 
for (int i = 2; i <= *100*; i++) 

Ты из границ своего массива, потому что ваш цикл условно слишком велик. Более традиционный подход был бы связан с контуром размером массива:

for (int i = 2; i < fib.Length; i++) 

И сделать ваш массив больше, но, как сказал Марк, есть лучшие способы сделать это, и я бы посоветовал вам провести некоторые время чтения статьи в Википедии по адресу Fibonacci numbers.

18

Вот забавное решение с использованием бесконечного итератора блока:

IEnumerable<int> Fibonacci() 
{ 
    int n1 = 0; 
    int n2 = 1; 

    yield return 1; 
    while (true) 
    { 
     int n = n1 + n2; 
     n1 = n2; 
     n2 = n; 
     yield return n; 
    } 
} 

bool isFibonacci(int n) 
{ 
    foreach (int f in Fibonacci()) 
    { 
     if (f > n) return false; 
     if (f == n) return true; 
    } 
} 

Я на самом деле очень нравится этот вид реализации Фибоначчи против рекурсивного решения традиции, потому что он держит работу, используемую для завершения срока, имеющегося для завершения следующий. Традиционное рекурсивное решение дублирует некоторые работы, поскольку для каждого термина требуется два рекурсивных вызова.

9

Проблема заключается в < = следующее утверждение:

более
for (int i = 2; i <= 100; i++) 

к точке =. Нет фина [100] (количество нулей C#), поэтому, когда вы проверяете i = 100, вы получаете исключение.

правильное заявление должно быть

for (int i = 2; i < 100; i++) 

или даже лучше

for (int i = 2; i < fib.Length; i++) 
+1

+1 Я поражен тем, что самый высокий ответ и принятый ответ не указывают на причину ошибки. ** Это актуальная проблема с его кодом. ** Он получает ** Исключить исключение из диапазона ** из-за доступа к 'fib [100]', в то время как последний элемент 'fib [99]'. –

1
public static int FibNo(int n) { 
    int result = 0; int No = 0; int N1 = 1; 

    if (n< 0) 
    { throw new ArguementException("number must be a positive value"); } 

    if (n <= 1) 
    { result = n; return result; } 

    for(int x=1; x < n; x++) 
    { result = No + N1; No = N1; N1=result; } 

    return result; 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^