El código consiste en hacer un arreglo a partir de un rango de números y además tener un tercer argumento en el cual indica los pasos de los números, si tiene un paso de 2 pues por ejemplo va de [1,3,5] al el código funciona bien, excepto cuando paso el step
con un número negativo como argumento, por ejemplo NumberRange(10,5,-2)
; Ahí es cuando aparece el error, en el código muestra la lógica que usé para un paso negativo.
function NumberRange(start, end, step){ var numberList = []; if(typeof(step) == 'undefined'){ if(start < end){ for(;start <= end; start++){ numberList.push(start); } console.log(numberList); } else if(start > end){ for(;start >= end;){ numberList.push(start); start -= 1; } console.log(numberList); } } else if(start > end && (Math.sign(step) == -1)){ // This is the logic I created when a negative step is given as an argument. for(;start >= end; start - step){ numberList.push(start); } console.log(numberList); } else if(start < end && (Math.sign(step) == -1)){ console.log("Negative step cant work since the value of the beginning of the list is less than the end of it") } else{ for(;start <= end;){ numberList.push(start); start += step; } console.log(numberList); } //return numberList; }; NumberRange(10,5,-2);
Tiene un error tipográfico en la tercera declaración for
, la última parte debe ser una asignación de resta:
for(;start >= end; start += step){ numberList.push(start); }
Pero el problema que está observando sugiere un error interno en el motor V8 (un error), probablemente un intento de asignar una cantidad incorrecta de memoria. Podría reproducirlo en Node.js y en Chrome con un bucle sin fin simple como el que se muestra a continuación.
var numberList = []; while (true) { numberList.push(1); }
En mi máquina, esto falla después de solo unos segundos, cuando la matriz contiene 112813858 elementos.
for(;condition;)
es solo una forma fea de escribir while(condition)
, no lo hagas.
La razón por la que no funciona es la parte for(;start >= end; start - step)
, que no actualiza start
, simplemente resta el step
y desecha el resultado. Por qué no funcionaría con -
es que el step
es negativo en esa rama, por lo que debe ser start += step
para contar hacia abajo.
Por lo general, no necesita las 4 ramas, en su lugar, puede configurar el step
en +/-1 si no está undefined
, y si realmente lo desea, aún puede validar el signo del step
después de configurarlo pero antes de usarlo:
function NumberRange(start, end, step) { if (typeof(step) == 'undefined') { step = Math.sign(end - start); } if (Math.sign(step) != Math.sign(end - start)) { console.log(`Can't count from ${start} to ${end} using ${step} as stepsize.`); } else { var numberList = []; if (start > end) { while (start > end) { numberList.push(start); start += step; } } else { while (start < end) { numberList.push(start); start += step; } } console.log(numberList.join()); return numberList; } } NumberRange(10, 5, -2); NumberRange(1, 2); NumberRange(2, 1); NumberRange(1, 3, 2); NumberRange(1, 3, -2); NumberRange(3, 1, -2); NumberRange(3, 1, 2);
Entonces alguien puede molestarse por tener dos bucles con cuerpos idénticos y, después de todo, con una condición un poco más complicada, pueden colapsarse en uno:
function NumberRange(start, end, step) { if (typeof(step) == 'undefined') { step = Math.sign(end - start); } if (Math.sign(step) != Math.sign(end - start)) { console.log(`Can't count from ${start} to ${end} using ${step} as stepsize.`); } else { var numberList = []; while ((step > 0 && start < end) || (step < 0 && start > end)) { numberList.push(start); start += step; } console.log(numberList.join()); return numberList; } } NumberRange(10, 5, -2); NumberRange(1, 2); NumberRange(2, 1); NumberRange(1, 3, 2); NumberRange(1, 3, -2); NumberRange(3, 1, -2); NumberRange(3, 1, 2);