2009-06-25 9 views
5

Realmente me encantan las matemáticas. Quiero decir, realmente soy una mierda en matemáticas. Estoy tratando de hacer una clase de secuencia de fibonacci simple para un algoritmo que voy a utilizar. He visto el ejemplo de pitón que se ve algo como esto:Cómo crear la secuencia de Fibonacci en Java

a = 0 
b = 1 
while b < 10: 
    print b 
    a, b = b, b+a 

El problema es que no puedo hacer este trabajo en cualquier otro idioma. Me gustaría hacer que funcione en Java, ya que puedo traducirlo bastante bien a los otros idiomas que uso desde allí. Este es el pensamiento en general:?

public class FibonacciAlgorithm { 

    private Integer a = 0; 

    private Integer b = 1; 

    public FibonacciAlgorithm() { 

    } 

    public Integer increment() { 
     a = b; 
     b = a + b; 
     return value; 
    } 

    public Integer getValue() { 
     return b; 
    } 
} 

Todo lo que termino con se duplica, lo que yo podía hacer con la multiplicación :( ¿Puede alguien ayudarme matemáticas me pwns

+1

Creo que no hay razón para usar la clase Integer. es mejor que uses int, en este caso. – cd1

+0

Las asignaciones simultáneas son realmente agradables. Me pregunto si alguien sabe por qué no son parte de Java. –

+0

@ThomasAhle probablemente porque son confusos como el infierno :) –

Respuesta

7

lo haría de esta manera:

public class FibonacciAlgorithm { 

    private int a = 0; 

    private int b = 1; 

    public FibonacciAlgorithm() { 

    } 

    public int increment() { 
     int temp = b; 
     b = a + b; 
     a = temp; 
     return value; 
    } 

    public int getValue() { 
     return b; 
    } 
} 

Esto mantiene lo más cerca posible de su código Java original como sea posible.

[Nota del editor: Integers han sido reemplazados con ints. No hay ninguna razón para usar Integers para esto.]

+0

¡Gracias! ¡Eso soluciona totalmente mi problema! ¡Gracias por volver tan rápido! Me estaba arrancando el pelo con el código de Python. No tenía idea de por qué se ejecutaría correctamente en Python y no en Java. ¡Gracias! –

+0

Java no tiene una tarea paralela como Python, por lo que necesita la variable de temperatura. El problema no es matemática, sino una comprensión más profunda de qué significa tener una asignación paralela (S. Lott describe el significado razonablemente bien). –

4

La línea

.
a, b = b, b+a 

no se traduce fácilmente. es algo como esto. se podría simplificarlo. este es el significado literal.

t1 = b 
t2 = b+a 
a = t1 
b = t2 
-1

public Entero increment() { a = b; b = a + b; valor de retorno; }

Es ciertamente incorrecto. Creo que cambiar las primeras dos líneas debería ser el truco

+0

¡Sin duda no lo hará! Necesita un temporal, como se indica en otra parte. –

2

Primero debe almacenar el valor de a o b en una variable temporal;

public Integer increment() 
    {     
      int temp = a; 
      a = b; 
      b = temp + b; 
      return value; 
    } 
1

Los enteros de Java solo pueden almacenar los primeros 46 números de Fibonacci, use una tabla de búsqueda.

0

Voy a traducir el código anterior:

public void fibb(int max) { 
    int a = 0; 
    int b = 1; 
    while (a < max) { 
    System.out.println(a); 
    int temp = a + b; 
    a = b; 
    b = temp; 
    } 
} 
0

¿No desea crear una función para devolver el número Fibnoacci enésimo? Esto es lo que recuerdo se enseña cuando yo era un niño:

public int Fibb(int index) { 
if (index < 2) 
    return 1; 
else 
    return Fibb(index-1)+Fibb(index-2); 
}; 

Dada la definición de ser el primer par de números Fibbonaci son 1 y todo lo demás se basa fuera de eso. Ahora, si simplemente desea imprimir el Fibonaccis, un ciclo puede ser más simple, que es lo que cubren muchas de las otras respuestas.

+1

Ese algoritmo lleva tiempo creciendo exponencialmente en el valor inicial del índice, ya que mantiene recalculando los mismos números. –

+0

No dije que era óptimo, solo que esto es cómo se enseñaba la recursividad cuando tenía Computer Science 101 en la universidad. –

0

El principal problema con su traducción de Python a Java es que la instrucción de asignación de Python se ejecuta allí de una vez, mientras que las de Java se ejecutan en serie.La declaración de Python es equivalente a decir esto: (. En realidad podría ser una tupla, no estoy exactamente fluidez en Python)

Make a list out of 'b' and 'a + b' 
Make another list out of references to 'a' and 'b' 
Assign all the elements from the second list to the first one 

Así que la 'b' y '+ b' determinación de valores antes de que sean asignados No se puede hacer ese tipo de asignación simultánea múltiple en Java.

En general, una declaración en Python como

var1, var2, ...varN = expression1, expression2, ...expressionN 

se va a traducir en Java para

temp1 = expression1; 
temp2 = expression2; 
... 
tempN = expressionN; 
var1 = temp1; 
var2 = temp2; 
... 
varN = tempN; 

De esta manera todas las expresiones se resuelven con los valores antes las asignaciones suceden, y ninguno de las asignaciones tienen efectos secundarios en las expresiones.

Si estuviera haciendo esto de verdad probablemente haría la tabla de búsqueda y almacenes largos (ya que los números de Fibonacci crecen vagamente exponencialmente y quisiera ir más allá de 46). La forma iterativa, como la que tiene, tomará O (N) para calcular el Nth valor de Fibonacci; la formulación recursiva típica tomará tantas llamadas a función como el valor devuelto. Fibonacci prácticamente pide que las respuestas se almacenen en algún lugar, y esto haría que la forma recursiva fuera mucho más factible.

+0

Sí, es probable que termine generando valores largos. –

0

Hubo una solución recursiva publicada anteriormente, pero esta solución es recursiva por la cola, por lo que crece linealmente.

public class Fibonacci { 
    public long fibonacci(int number) { 
     return fib(0,1,number); 
    } 

    private long fib(long result, long next, int n) { 
     if (n == 0) 
      return result; 
     else 
      return fib(next, result+next, n-1); 
    } 
} 
0

Voy a hacer esto

fib = 100; 
for(int a = 1, b = 0;a <= fib;a += b, b = (a-b)) { 
    System.out.print(a + ","); 
} 
+0

Este valor int se desbordará después de los primeros 40 valores aproximadamente. Los últimos 60 serán valores desbordados y sin sentido. ;) –

Cuestiones relacionadas