Pregunta

Estoy practicando una aplicación de consola de C #, y yo estoy tratando de conseguir la función para verificar si el número aparece en una serie de Fibonacci o no, pero estoy recibiendo errores.

Lo que hice fue:

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

¿Alguien puede decirme qué estoy haciendo mal aquí?

¿Fue útil?

Solución

Y aquí es una solución que supera a todos ustedes!

Debido a que, ¿por qué iteración cuando se tiene inteligentes matemáticos haciendo de forma cerrada soluciones para usted? :)

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

Otros consejos

Aquí hay una solución diversión usando un bloque de iterador infinita:

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

De hecho, me gusta mucho este tipo de aplicación de Fibonacci vs la solución recursiva tradición, ya que mantiene la obra utilizada para completar un plazo disponible para completar la siguiente. La solución recursiva tradicional duplica algo de trabajo, ya que necesita dos llamadas recursivas cada plazo.

El problema radica en <= la siguiente declaración:

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

más al punto los =. No hay ninguna fib [100] (C # cuenta cero) por lo que cuando se echa en i = 100 se obtiene una excepción.

la declaración apropiada debe ser

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

o incluso mejor

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

Bueno, para empezar la matriz es sólo el 10 de largo y se está llenando con ~ 100 elementos (fuera de rango en excepciones) - pero hay mejores maneras de hacer esto ...

Por ejemplo, usando este post :

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

vas a salir de los límites de la matriz debido a que su bucle condicional es demasiado grande. Un enfoque más tradicional sería para limitar el bucle por el tamaño de la matriz:

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

y hacer su arreglo más grande, pero como dijo Marc, hay mejores maneras de hacer esto, y yo le aconsejo que pasar algún leer el artículo de Wikipedia sobre números de Fibonacci .

Una cosa que puede hacer es comprobar si hay una salida temprana. Puesto que usted está tratando de determinar si un número dado es en la secuencia de Fibonacci, que puede hacer la comprobación de límites para salir temprano.

Ejemplo:

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;

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top