Если бы вы сделали «Array(N)», вы могли бы использовать их пустое состояние в качестве триггера, пропуская бессмысленный внутренний цикл.
Если у вас есть несколько var подряд, не говорите var для каждого, вместо этого используйте запятую.
Когда у вас есть совершенно хороший цикл условия вместо while(true), в 99% случаев, когда вы видите while(true), вы смотрите на ошибочную или сломанную логику.
Но самое главное, вы ссылаетесь на несуществующую переменную K. Вы имели в виду М, который вы не использовали? Это лишь часть того, почему неважно, как сильно «за классной доской» математические придурки ЛЮБЯТ свои однобуквенные переменные, они просто поощряют делать ошибки в любой реальной задаче.
Даже не говорите мне о бессмысленном использовании CONST, выполняющем обычную работу функции, или о пропуске точки с запятой, умоляющей о хрупкости кода.
И ваше решение даже не работает, поскольку, если M на самом деле является вашим K, вы не увеличиваете его по кругу и не компенсируете попадания в пул.
Таким образом, в вашем примере 11,3 должно возвращать [ 8, 4, 10, 1, 7, 6, 2, 11, 9, 3, 6 ]
, но ваша логика ошибочна.
function joseph(numPrisoners, skip) { var result = Array(numPrisoners), dead = 0, finger = 0; while (dead < numPrisoners) { var i = skip; // skip ahead do { finger = (finger + 1) % numPrisoners; // only count the living if (!result[finger]) i--; } while (i); // if we landed on the dead, skip ahead to the next living while (result[finger]) finger = (finger + 1) % numPrisoners; result[finger] = ++dead; } return result; } console.log(joseph(11,3)); // [ 8, 4, 10, 1, 7, 6, 2, 11, 9, 3, 6 ]
Видеть?