Цикл JavaScript с использованием заданного количества шагов при пропуске определенного шага - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь создать цикл, который позволяет вам увеличиваться с шагом в один раз, используя количество шагов «х» при пропуске определенного шага.В примере 1 у вас есть 2 действия, и вам нужно пропустить шаг 2., чтобы перейти от 0 к 1, а затем от 1 до 3. В примере 2 вам нужно 3 действия, и вам нужно пропустить шаг 3, чтобы вы могли либо перейти с 0.до 1, подождите 1 раунд, затем перейдите от 1 до 4, так как вы пропустите два.или вы можете подождать 0, затем перейти к 2, а затем перейти к 5.

я знаю, что я близок, используя цикл while с continue, но он не совсем работает, как ожидалось.

function maxStep(n, k) {
    let step = n
    let bad = k
    let total = 0
    while (total <= step) {
        total += 1
        if (total === bad) {
            continue;
        }
        total += 1
        return total
    }
}

1 Ответ

1 голос
/ 07 мая 2019

Привет и добро пожаловать @jaronow!

Сначала continue пропускает вас к следующей итерации while.Итак, что вы написали здесь ...

if (total === bad) {
    continue;
}
total += 1

... на самом деле означает, "Если это неверное количество шагов, пропустите добавление 1." Но вы имеете в видунаоборот, не так ли?

if (total === bad) {
    total += 1
}

Теперь это говорит: «Если это неверное количество шагов, добавьте еще 1». Там, так что теперь у нас есть

function maxStep(n, k) {
    let step = n
    let bad = k
    let total = 0
    while (total <= step) {
        total += 1
        if (total === bad) {
            total += 1 // Put this here instead of continue.
        }
        return total
    }
}

Теперь, где вы положили, это странно:

return total

Это фактически завершает всю функцию при первом обнаружении.Конечно, вы хотите рассчитать total, выполнив цикл столько раз, сколько необходимо, а затем вернуть результат в end , например:

function maxStep(n, k) {
    let step = n
    let bad = k
    let total = 0
    while (total <= step) {
        total += 1
        if (total === bad) {
            total += 1
        }
    }
    return total // Moved this out.
}

Наконец, есть два тонкихпроблемы (заметил второй позже).Во-первых, если вы делаете этот «дополнительный шаг» из-за того, что вы столкнулись с плохим шагом, вам также нужно увеличить step, так как это максимальное количество шагов, которые вы планируете сделать.Но также, как только вы достигнете этого количества шагов, вы не захотите снова входить в цикл и добавлять еще к total, поэтому вам нужно использовать < вместо <=.(Вы найдете в программировании общую схему, когда, когда вы намереваетесь делать N раз, вы пишете свои циклы, говоря < N, а не <= N.)

function maxStep(n, k) {
    let step = n
    let bad = k
    let total = 0
    while (total < step) {
        total += 1
        if (total === bad) {
            total += 1
            step += 1 // Add this.
        }
    }
    return total
}

В противном случае ваш total всегда будет заканчиваться исходным числом step с.

Существуют другие более короткие, возможно, более умные способы решения этой проблемы, но я стремлюсь учить, придерживаясь вашей формулировки.


Не то, о чем вам нужно заботиться, но в случае, если вы захотите увидеть, опытный программист может «рефакторинг» вашего кода следующим образом:

function getStepsTaken(desiredStepsToTake, badNumberOfSteps) {
    let stepsToTake = desiredStepsToTake
    // let bad = k (don't need this line)
    let stepsTaken = 0
    while (stepsTaken < stepsToTake) {
        stepsTaken += 1
        if (stepsTaken === badNumberOfSteps) {
            stepsTaken += 1
            stepsToTake += 1
        }
    }
    return stepsTaken
}

Вы можете посчитать это уродливым,и действительно, это намного более многословно, но всегда лучше прояснить ситуацию, даже если только для вас самих, и вы позже переименуете переменные.

Хотя надежная попытка, продолжайте в том же духе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...