Tengo este código en JS
//param A : array of integers //param B : array of integers //return an integer function doesitwork(A, B) { if (A.length != B.length) { return -1; } var i = 0; var tank; var count; var johnny = true; for (var j = 0; j < A.length; j++) { count = 0; tank = 0; i = j; johnny = true; while (count < A.length && johnny == true) { console.log(i); console.log(A.length); console.log(count); console.log(johnny); tank += A[i]; if (B[i] <= tank) tank -= B[i]; else { johnny = false; } count++; i++; if (i == A.length) i == 0; } while (johnny == true) { if (count == A.length) return j; } } return -1; } var A = [1, 2]; var B = [2, 1]; console.log(doesitwork(A, B));Lo que no entiendo es cuando ejecuto el programa, al principio cuenta = 0, pero cuando entro por primera vez en el ciclo while, en lugar de ejecutar el comando contar ++ y cambiar su valor a 1, no lo ejecuta , mantiene la cuenta en 0 y luego la cambia después de volver a entrar en el bucle.
TLDR: mientras que el bucle se ejecuta dos veces con una de las variables que permanece con el mismo valor en lugar de cambiarlo como sugiere una de las líneas en el bucle.
No está claro qué está tratando de hacer, pero la condición del ciclo while no siempre será cierta, lo que hace que count= 0 dentro del ciclo for . Entonces, necesitas poner var count =0;
//param A : array of integers //param B : array of integers //return an integer function doesitwork(A, B) { if (A.length != B.length) { return -1; } var i = 0; var tank; var count=0; var johnny = true; for (var j = 0; j < A.length; j++) { tank = 0; i = j; johnny = true; while (count < A.length && johnny == true) { console.log(i); console.log(A.length); console.log(count); console.log(johnny); tank += A[i]; if (B[i] <= tank) tank -= B[i]; else { johnny = false; } count++; i++; if (i == A.length) i == 0; } while (johnny == true) { if (count == A.length) return j; } } return -1; } var A = [1, 2]; var B = [2, 1]; console.log(doesitwork(A, B));TLDR: mientras que el bucle se ejecuta dos veces con una de las variables que permanece con el mismo valor en lugar de cambiarlo como sugiere una de las líneas en el bucle.
Está asumiendo que el count nunca se incrementó, porque está asumiendo que el ciclo while continúa por segunda vez. En realidad, el bucle while sale después de una sola iteración y el bucle for reinicia la count a 0 . Luego se ingresa nuevamente al ciclo while , pero con un valor diferente para j .
La primera vez que pasa por su ciclo while , B[i] es 2 y A[i] es 1 . tank += A[i] hace que tank tenga un valor de 1 . Por lo tanto, b[i] <= tank es false , por lo que establece johnny en false . Eso significa que al final de esa iteración, su condición while ( ... && johnny == true ) es false , por lo que no continúa con el ciclo while por segunda vez.
En su lugar, el control se traslada al bucle for , que restablece la count a 0 .
Para depurar problemas como este en el futuro, es útil aprender a usar el depurador: puede colocar un punto de interrupción donde desee y ver cómo fluye el control y cómo cambian las variables a medida que avanza. Si encuentra que eso no es posible, es posible que deba ser aún más detallado con su registro, como se muestra a continuación.
//param A : array of integers //param B : array of integers //return an integer function doesitwork(A, B) { if (A.length != B.length) { return -1; } var i = 0; var tank; var count; var johnny = true; for (var j = 0; j < A.length; j++) { console.log("entering for loop"); count = 0; tank = 0; i = j; johnny = true; while (count < A.length && johnny == true) { console.log("entering while loop"); console.log("i", i); console.log("j", j); console.log("A.length", A.length); console.log("count", count); console.log("johnny", johnny); tank += A[i]; if (B[i] <= tank) tank -= B[i]; else { console.log(B[i], tank, "setting johnny to false"); johnny = false; } count++; i++; if (i == A.length) i == 0; } while (johnny == true) { if (count == A.length) return j; } } return -1; } var A = [1, 2]; var B = [2, 1]; console.log(doesitwork(A, B));