Consulte el código de Python para encontrar números primos entre dos números inferiores y superiores dados:
lower = 3 upper = 15 print("Prime numbers between", lower, "and", upper, "are:") for num in range(lower, upper + 1): for i in range(2, num): if (num % i) == 0: break else: print(num)Salida de Python:
Prime numbers between 3 and 15 are: 3 5 7 11 13Un código casi similar en Julia da una salida incorrecta. Vea el código de Julia a continuación:
lower = 3 upper = 15 println("Prime numbers between ", lower, " and “, upper, " are:”) for num in lower:upper for i in 2: num-1 if (num % i) == 0 break else println(num) break end end endSalida Julia:
Prime numbers between 3 and 15 are: 3 5 7 9 11 13 15Claramente, 9 y 15 no son números primos. ¿Por qué el código de Python da una salida correcta y el código de Julia no? ¿Alguna forma de solucionarlo usando la misma lógica algorítmica?
Aquí está el código que usaría que mantiene la misma lógica algorítmica según su solicitud (escribo este código de esta manera ya que la condición dentro del ciclo no solo es eficiente sino que también se lee naturalmente: "cualquiera de los números del rango 2:num-1 divide num o imprime num "):
julia> lower = 3 3 julia> upper = 15 15 julia> println("Prime numbers between $lower and $upper are:") Prime numbers between 3 and 15 are: julia> for num in lower:upper any(i -> num % i == 0, 2:num-1) || println(num) end 3 5 7 11 13 Según los comentarios a su pregunta en Julia, no tiene una cláusula else en for loop. Sin embargo, el uso de any función mantiene la misma lógica que su código, ya que es una función de circuito corto (logra el mismo efecto que la break en su ciclo for).
Si algo no está claro en mi código, por favor hágamelo saber.
EDITAR:
Reescribiré el código para explicar cómo funciona.
Primero el || parte. Utiliza el comportamiento de cortocircuito de || operador. Entonces, en el primer nivel, esto se puede reescribir como:
julia> lower = 3 3 julia> upper = 15 15 julia> println("Prime numbers between $lower and $upper are:") Prime numbers between 3 and 15 are: julia> for num in lower:upper iscomposite = any(i -> num % i == 0, 2:num-1) if !iscomposite println(num) end end 3 5 7 11 13 Ahora, como se comentó, any también está haciendo un circuito corto, por lo que es equivalente a escribir:
julia> lower = 3 3 julia> upper = 15 15 julia> println("Prime numbers between $lower and $upper are:") Prime numbers between 3 and 15 are: julia> for num in lower:upper iscomposite = false for i in 2:num-1 if num % i == 0 iscomposite = true break end end if !iscomposite println(num) end end 3 5 7 11 13Su código de Julia parece imprimirse en el interior y romper el ciclo de verificación de factores en lugar de esperar a que se verifiquen todos los factores. (No conozco a Julia, pero esa parece ser una diferencia obvia).