цикл подсчета до 100 и обратно до 0 и до 100 снова и так далее

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

У меня есть число, скажем i=0. У меня есть функция, которая увеличивает i при каждом вызове на 1, а затем снова вызывает себя, увеличивая i еще раз, и еще, и еще ... Когда я достигну 100, я хочу, чтобы он считал назад до 0, а затем снова вверх, как петля endles с Я иду вверх и вниз, как лифт. Какое элегантное решение для этого?

мой решение пока:

var countingUp = true;
var i = 0;

function count() {
if(i < 100 && countingUp) {i+=1}
if(i > 1 && !countingUp) {i-=1}

if(i===100) {countingUp=false;}
if(i===1) {countingUp=true;}

count()
}
count()

Я ищу что-то короче.

4 ответов


выглядит нормально для меня, но, вероятно, продаст вашу собаку в рабство и украдет ваше пиво:

var direction = 1;
var i = 0;

function count() {
   i += direction;
   direction *= (((i % 100) == 0) ? -1 : 1);
}

выражение abs((i % 200) - 100) делает пилообразный шаблон, который вы хотите по мере увеличения.

Итак, что-то вроде этого:

var i = 100;
while (1) {
    var j = Math.abs((i % 200) - 100);
    // Use j
    // ...
    i += 1;
}

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

var countingUp = 1;
var i = 0;

function count() {

    i += (1 * countingUp);

    if (i == 100 || i == 0)
    {
        countingUp *= -1;
    }
}

скрипка здесь.

чтобы избежать бесконечной рекурсии, просто используйте setInterval ().

window.setInterval( count, 1 );

просто для удовольствия:

function createCounter(min,max) {
    var dir = -1, val = min;
    return function() { return val += ((val >= max || val <= min) ? dir=-dir : dir); }
}

и затем использовать его

var counter = createCounter(0,5);
counter(); // 1
counter(); // 2
counter(); // 3
counter(); // 4
counter(); // 5
counter(); // 4
counter(); // 3
counter(); // 2
counter(); // 1
counter(); // 0
counter(); // 1
counter(); // 2