Escribí una función en javascript que se supone que devuelve el número primo más bajo mayor que x. En cambio, queda atrapado en una recursividad indefinida.
function next_prime(x) { if (x <= 1) { return 2; } y = 2; z = x + 1; while(true) { if (z % y == 0) { z++; y = 2; continue; } if(y * y > z) { return z; } y = next_prime(y); } }No entendí qué estaba mal, así que implementé la misma función en python, donde funcionó bien.
def next_prime(x): if x <= 1: return 2 y = 2 z = x + 1 while True: if z % y == 0: z += 1 y = 2 continue if y * y > z: return z y = next_prime(y)Revisé ambas funciones y estoy seguro de que son idénticas, pero en python funciona y en javascript no.
Aunque se agradece, no necesariamente estoy buscando ayuda con este problema específico, estoy más interesado en lo que realmente está sucediendo aquí.
Creo que el problema es que no estás declarando tus variables correctamente. En JavaScript, debe usar las palabras clave let y const , que significan variables reasignables y no reasignables, al declarar una nueva variable. Cuando se usan las líneas let in cinco y seis, la función funciona bien.
Debe usar el modo estricto para evitar este error común de los principiantes de javascript.
su código js real con 'uso estricto'; se rechaza :
'use strict'; console.log( next_prime(7) ) // never run on strict mode, otherwise make an infinite loop function next_prime(x) { if (x <= 1) { return 2; } y = 2; z = x + 1; while(true) { if (z % y == 0) { z++; y = 2; continue; } if(y * y > z) { return z; } y = next_prime(y); } }mismo código en la sintaxis javascript correcta:
'use strict'; console.log( next_prime(7) ) // -> 11 function next_prime(x) { if (x <= 1) return 2 ; let y = 2, z = x + 1 // declare y and z as locale ; while(true) { if (z % y == 0) { z++; y = 2; continue; } if (y**2 > z) return z ; y = next_prime(y); } }explicación: su código es recursivo, la llamada interna cambiará el valor de y y z en las llamadas principales y hará un ciclo infinito