Originalmente había codificado el programa incorrectamente. En lugar de devolver los números de Fibonacci entre un rango (es decir, startNumber 1, endNumber 20 debería = solo aquellos números entre 1 y 20), he escrito para que el programa muestre todos los números de Fibonacci entre un rango (ie. StartNumber 1, endNumber 20 muestra = primeros 20 números de Fibonacci). Pensé que tenía un código seguro. Tampoco veo por qué sucede esto.
startNumber = int(raw_input("Enter the start number here "))
endNumber = int(raw_input("Enter the end number here "))
def fib(n):
if n < 2:
return n
return fib(n-2) + fib(n-1)
print map(fib, range(startNumber, endNumber))
Alguien señaló en mi Parte II (que estaba cerrada por ser un duplicado - /programming/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii ) que yo necesita pasar startNumber y endNumber a través de un generador usando un ciclo while. ¿Alguien puede señalarme la dirección de cómo hacer esto? Cualquier ayuda es bienvenida.
Soy un programador de aprendizaje y me he encontrado con un poco de confusión. Se me pide que escriba un programa que calcule y muestre la secuencia de Fibonacci por un número de inicio y un número de finalización ingresados por el usuario (es decir, número de inicio = 20 número de finalización = 100 y mostrará solo los números entre ese rango). El truco es usarlo de manera inclusiva (¿qué no sé cómo hacer en Python? ¿Supongo que esto significa usar un rango inclusivo?).
Lo que tengo hasta ahora no es una codificación real, sino más bien:
- Escribe la fórmula de secuencia de Fib hasta infinito
- Muestra startNumber to endNumber solo de la secuencia Fib.
No tengo idea por dónde empezar y estoy pidiendo ideas o ideas sobre cómo escribir esto. También he tratado de escribir la secuencia de Fibra forumla pero también me pierdo en eso.
int(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5)))
, ¿alguna idea? @AndreaAmbun
está por encima de 70 y explota con unOverflowError
cuandon
está ligeramente por encima de 600. Otros enfoques pueden manejar un valorn
de 1000 o más sin soplar arriba o perdiendo precisión.Generador pitónico eficiente de la secuencia de Fibonacci
Encontré esta pregunta al intentar obtener la generación Pythonic más corta de esta secuencia (más tarde me di cuenta de que había visto una similar en una Propuesta de Mejora de Python ), y no he notado que nadie más haya encontrado mi solución específica (aunque la respuesta principal se acerca, pero aún menos elegante), así que aquí está, con comentarios que describen la primera iteración, porque creo que eso puede ayudar a los lectores a comprender:
y uso:
huellas dactilares:
(Para fines de atribución, recientemente noté una implementación similar en la documentación de Python en los módulos, incluso usando las variables
a
yb
, que ahora recuerdo haber visto antes de escribir esta respuesta. Pero creo que esta respuesta demuestra un mejor uso del lenguaje).Implementación definida recursivamente
La Enciclopedia en línea de secuencias enteras define la secuencia de Fibonacci recursivamente como
Definir sucintamente esto de forma recursiva en Python se puede hacer de la siguiente manera:
Pero esta representación exacta de la definición matemática es increíblemente ineficiente para números mucho mayores que 30, porque cada número que se calcula también debe calcular para cada número debajo de él. Puede demostrar lo lento que es utilizando lo siguiente:
Recursión memorable para la eficiencia
Se puede memorizar para mejorar la velocidad (este ejemplo aprovecha el hecho de que un argumento de palabra clave predeterminado es el mismo objeto cada vez que se llama a la función, pero normalmente no usaría un argumento predeterminado mutable por exactamente este motivo):
Descubrirá que la versión memorable es mucho más rápida y superará rápidamente su profundidad máxima de recursión antes de que pueda siquiera pensar en levantarse para tomar un café. Puede ver cuánto más rápido es visualmente haciendo esto:
(Puede parecer que podemos hacer lo siguiente, pero en realidad no nos permite aprovechar el caché, porque se llama a sí mismo antes de llamar a setdefault).
Generador definido recursivamente:
Como he estado aprendiendo Haskell, me encontré con esta implementación en Haskell:
Lo más cerca que creo que puedo llegar a esto en Python en este momento es:
Esto lo demuestra:
Sin embargo, solo puede subir hasta el límite de recurrencia. Por lo general, 1000, mientras que la versión de Haskell puede llegar a los cientos de millones, aunque utiliza los 8 GB de memoria de mi computadora portátil para hacerlo:
Consumir el iterador para obtener el enésimo número de Fibonacci
Un comentarista pregunta:
La documentación de itertools tiene una receta para esto:
y ahora:
fuente
setdefault
llamada se evalúa antes de quesetdefault
sea.¿Por qué no simplemente hacer lo siguiente?
fuente
La idea detrás de la secuencia de Fibonacci se muestra en el siguiente código de Python:
Esto significa que fib es una función que puede hacer una de tres cosas. Define fib (1) == 1, fib (0) == 0 y fib (n) como:
fib (n-1) + fib (n-2)
Donde n es un entero arbitrario. Esto significa que fib (2), por ejemplo, se expande a la siguiente aritmética:
Podemos calcular fib (3) de la misma manera con la aritmética que se muestra a continuación:
Lo importante a tener en cuenta aquí es que fib (3) no se puede calcular sin calcular fib (2), que se calcula conociendo las definiciones de fib (1) y fib (0). Tener una función que se llama a sí misma como lo hace la función de Fibonacci se llama recursión, y es un tema importante en la programación.
Esto suena como una tarea, así que no voy a hacer la parte inicial / final por ti. Sin embargo, Python es un lenguaje maravillosamente expresivo para esto, por lo que debería tener sentido si comprende las matemáticas y, con suerte, le enseñará sobre la recursividad. ¡Buena suerte!
Editar: Una posible crítica de mi código es que no utiliza el rendimiento de la función Python súper práctica, lo que hace que la función fib (n) sea mucho más corta. Sin embargo, mi ejemplo es un poco más genérico, ya que no muchos lenguajes fuera de Python tienen rendimiento.
fuente
Complejidad del tiempo:
La función de almacenamiento en caché reduce la forma normal de calcular las series de Fibonacci de O (2 ^ n) a O (n) al eliminar las repeticiones en el árbol recursivo de la serie de Fibonacci:
Código:
fuente
Esto es bastante eficiente, utilizando operaciones aritméticas básicas O (log n).
Éste utiliza operaciones aritméticas básicas O (1), pero el tamaño de los resultados intermedios es grande y, por lo tanto, no es del todo eficiente.
Éste calcula X ^ n en el anillo polinomial Z [X] / (X ^ 2 - X - 1) usando la exponenciación por cuadratura. El resultado de ese cálculo es el polinomio Fib (n) X + Fib (n-1), del cual se puede leer el enésimo número de Fibonacci.
Nuevamente, esto usa operaciones aritméticas O (log n) y es muy eficiente.
fuente
n -= 1
funcionar correctamente, y tampoco funcionan = 0
. En cualquier caso, realmente me ayudaría si se agregara mucho contexto para explicar cómo funcionan, especialmente la primera técnica. Veo que tienes una publicación en paulhankin.github.io/FibonacciCódigo canónico de Python para imprimir la secuencia de Fibonacci:
Para el problema "Imprima el primer número de Fibonacci de más de 1000 dígitos":
fuente
Lo sabemos
Y que la enésima potencia de esa matriz nos da:
Entonces podemos implementar una función que simplemente calcule la potencia de esa matriz a la potencia n-ésima -1.
como todos sabemos, el poder a ^ n es igual a
Entonces, al final, la función de Fibonacci sería O (n) ... nada realmente diferente a una implementación más fácil si no fuera por el hecho de que también lo sabemos
x^n * x^n = x^2n
y, por lo tanto, la evaluaciónx^n
se puede hacer con la complejidad O (log n )Aquí está mi implementación de Fibonacci usando lenguaje de programación rápido:
Esto tiene complejidad O (log n). Calculamos la potencia de Q con el exponente n-1 y luego tomamos el elemento m00 que es Fn + 1 que en el exponente de potencia n-1 es exactamente el enésimo número de Fibonacci que queríamos.
Una vez que tenga la función rápida de Fibonacci, puede iterar desde el número inicial y el número final para obtener la parte de la secuencia de Fibonacci que le interesa.
por supuesto, primero realice algunas verificaciones al inicio y al final para asegurarse de que puedan formar un rango válido.
Sé que la pregunta tiene 8 años, pero me divertí respondiendo de todos modos. :)
fuente
Secuencia de Fibonacci es:
1, 1, 2, 3, 5, 8, ...
.Es decir
f(1) = 1
,f(2) = 1
,f(3) = 2
,...
,f(n) = f(n-1) + f(n-2)
.Mi implementación favorita (la más simple y, sin embargo, alcanza una velocidad de la luz en comparación con otras implementaciones) es esta:
Prueba
Sincronización
Editar: un ejemplo de visualización para esta implementación.
fuente
usar recursividad:
fuente
Otra forma de hacerlo:
Asignar la lista a 'a', asignar un número entero a 'n' Map y reduce son 2 de las tres funciones más poderosas en python. Aquí el mapa se usa solo para iterar 'n-2' veces. un [-2:] obtendrá los dos últimos elementos de una matriz. a.append (x + y) agregará los dos últimos elementos y se agregará a la matriz
fuente
Todo esto parece un poco más complicado de lo que debe ser. Mi código es muy simple y rápido:
fuente
De acuerdo ... después de estar cansado de referir todas las respuestas largas, ahora encuentre la forma más sencilla y dulce a continuación para implementar Fibonacci en Python. Puede mejorarlo de la manera que desee obteniendo un argumento u obteniendo la entrada del usuario ... o cambiando los límites de 10000. Según lo necesite ......
Este enfoque también funciona bien. Encuentra los análisis de ejecución a continuación
fuente
Esta es una mejora a la respuesta de Matthew Henry:
el código debe imprimir b en lugar de imprimir c
salida: 1,1,2,3,5 ....
fuente
Usando for loop e imprime solo el resultado
Resultado
Imprima el que
list
contiene todos los númerosResultado
fuente
Resultados
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368 13, en El
tiempo de ejecución: 0.04298138618469238
fuente
¡Hay un método muy fácil para darse cuenta de eso!
puede ejecutar este código en línea libremente utilizando http://www.learnpython.org/
fuente
Se puede hacer de la siguiente manera.
fuente
Solo por diversión, en Python 3.8+ puede usar una expresión de asignación (también conocido como el operador de morsa) en una comprensión de la lista, por ejemplo:
Una expresión de asignación le permite asignar un valor a una variable y devolverlo en la misma expresión. Por lo tanto, la expresión
es equivalente a ejecutar
y devolviendo el valor de
b
.fuente
A los 15 minutos de un tutorial que usé cuando aprendí Python, le pidió al lector que escribiera un programa que calcule una secuencia de Fibonacci a partir de 3 números de entrada (primer número de Fibonacci, segundo número y número en el que detener la secuencia). El tutorial solo había cubierto variables, if / thens, y bucles hasta ese punto. Aún no hay funciones. Se me ocurrió el siguiente código:
Como puede ver, es realmente ineficiente, pero sí funciona.
fuente
fuente
eval(input())
no es necesario aquí; Creo queint(input())
en el caso es mejor.Simplemente revisando http://projecteuler.net/problem=2 esta fue mi opinión al respecto
fuente
fuente
Tal vez esto ayude
fuente
basado en la secuencia clásica de Fibonacci y solo por el bien de una línea
si solo necesita el número del índice, puede usar la reducción (incluso si la reducción no es la más adecuada para esto, puede ser un buen ejercicio)
y para obtener la matriz completa simplemente elimine o (r.pop (0) y 0)
fuente
¿Que tal este? Supongo que no es tan elegante como las otras sugerencias porque exige la especificación inicial del resultado anterior para producir el resultado esperado, pero creo que es una opción muy legible, es decir, todo lo que hace es proporcionar el resultado y el resultado anterior para La recursividad.
Aquí está la salida:
fuente
Básicamente traducido de Ruby:
...
fuente
fuente
Una explicación más detallada de cómo funciona Memoization para la secuencia de Fibonacci.
fuente
Estaba tratando de evitar una función recursiva para resolver este problema, así que tomé un enfoque iterativo. Originalmente estaba haciendo una función recursiva memorable, pero seguí alcanzando la profundidad recursiva máxima. También tenía objetivos estrictos de memoria, por lo que me verás manteniendo la matriz lo más pequeña posible durante el proceso de bucle, manteniendo solo 2-3 valores en la matriz en cualquier momento.
Obtener el número 6 millones de Fibonacci toma alrededor de 282 segundos en mi máquina, mientras que el 600K Fibonacci toma solo 2.8 segundos. No pude obtener números de Fibonacci tan grandes con una función recursiva, incluso una memorable.
fuente