Вопрос

Я использую консольное приложение 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;
    }
}

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

Это было полезно?

Решение

И вот решение, которое превосходит все ваши!

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

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

Другие советы

Вот забавное решение, использующее бесконечный блок итератора:

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

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

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

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

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

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

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

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

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

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

например, используя этот пост:

long val = ...
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val;
int[] fib = new int[10];
for (int i = 2; i <= *100*; i++)

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

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

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

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

Пример:

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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top