Estoy escribiendo este código para algo llamado 'Proyecto Euler' que es básicamente una cosa de matemáticas / ciencias de la computación en línea, cuyo enlace se puede encontrar aquí:

De todos modos, cuando ejecuto mi código que está en Python 3.5, no hace nada en el shell, excepto que el bit del cursor parpadea. Aquí está el código en cuestión:

`mylist=[]
a=1
b=2
c=a+b
def fib():
    a=1
    b=2
    c=a+b
    a=b
    b=c
    c=a+b
if a%2==0:
    mylist.append(a) and print(a)
elif b%2==0:
    mylist.append(b) and print(b)
elif c%2==0:
    mylist.append(c) and print(c)
else:
    print(end='')
while a and b and c<4000000:
    fib()
print(sum(mylist))'

La pregunta que estoy tratando de responder es

Al considerar los términos en la secuencia de Fibonacci cuyos valores no exceden los cuatro millones, encuentre la suma de los términos de valor par.

El código está destinado a agregar incluso números de Fibonacci hasta 4 millones a una lista y luego imprimir la suma de ellos, lo que respondería perfectamente a la pregunta, pero no parece funcionar.

1
S.L 15 ene. 2017 a las 19:49
No genera nada porque usted le dijo que lo hiciera. Solo llama a la función fib() (tal vez) cuatro millones de veces y esa función no hace más que establecer algunas variables no utilizadas.
 – 
Monkey Supersonic
15 ene. 2017 a las 20:02
Por cierto: parece tener un concepto erróneo sobre la palabra clave and, que es una conjunción lógica y no para "concatenar" comandos.
 – 
Monkey Supersonic
15 ene. 2017 a las 20:12
Honestamente, estás haciendo un mal uso de las palabras clave "si", "y" aquí, y tu lógica es algo oscura, es posible que desees volver a escribirla después de investigar primero cómo escribir un Fibonacci.
 – 
Xlee
15 ene. 2017 a las 20:14
Gracias por la ayuda @Monkey Supersonic. ¿Sería mejor sangrar la sección list.append?
 – 
S.L
15 ene. 2017 a las 20:15

1 respuesta

La mejor respuesta

Ha creado un bucle infinito aquí:

while a and b and c < 4000000:

Esto se traduce como "mientras a es veraz yb es veraz yc es menor que 4000000", y esto siempre será True por lo que su ciclo while nunca terminará. Lo que quiero decir con "veraz" es: ¿bool(value) devuelve True? Si es así, entonces value es "veraz". Entonces 1, 'hello', [], etc., son veraces, y 0, False, [], etc., no lo son ( son "falsey"). No comentaré toda su lógica porque se beneficiará más al resolver el problema por su cuenta. Sin embargo, aquí hay algunos consejos que deberían ayudarlo a despegar:

  1. Si desea comprobar que a, b y c son todos menos que 4000000, puede hacer lo siguiente:

    while a < 4000000 and b < 4000000 and c < 4000000:
    

    o más sucintamente:

    while all(i < 4000000 for i in [a, b, c]):
    
  2. Para no crear un bucle infinito, deberá asegurarse de que a, b o c sean mayores que 4000000 en algún momento de su programa al incriminar sus valores. . Las matemáticas que haces en a, b y c dentro tu función fib() solo manipula tres variables llamadas a, b y c que son locales para esa función; no cambia los valores de a, b y c fuera de esa función.

0
elethan 15 ene. 2017 a las 20:31
Muchas gracias @elethan, ¡definitivamente tendré en cuenta a ambos!
 – 
S.L
15 ene. 2017 a las 21:08