Нужна помощь в математике, чтобы написать колеблющийся итератор в CoffeeScript или Javascript - PullRequest
2 голосов
/ 11 февраля 2012

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

# Pseudo Coffeescript class

Class OscillatingIterator

    constructor: ( low, high, increment )->
        this.low = low
        this.high = high
        this.i = increment

    iter: ->
      ### can haz magical math code plz? ###

# Usage

oi = new OscillatingIterator( 1, 5 , 1 )

# outputs

oi.iter() #=> 1
oi.iter() #=> 2
oi.iter() #=> 3
oi.iter() #=> 4
oi.iter() #=> 5
oi.iter() #=> 4
oi.iter() #=> 3
oi.iter() #=> 2
oi.iter() #=> 1
oi.iter() #=> 2
oi.iter() #=> 3
oi.iter() #=> 4
oi.iter() #=> 5
oi.iter() #=> 4
oi.iter() #=> ...

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Как и ори, кроме CoffeeScript

createOscillator = (low, high, step = 1) ->
  value = low
  ->
    current = value
    value += step
    step *= -1 if value <= low or value >= high
    current

Использование

osc = createOscillator 0, 5, 1
console.log osc() for i in [0..10]

Печать

0
1
2
3
4
5
4
3
2
1
0

Редактировать: условие фиксированных границ

2 голосов
/ 11 февраля 2012

Я немного изменил версию, написанную ori . Я думаю, что такое поведение должно иметь осциллятор. Изменение знака приращения для отскока от границы - только часть того, что должно быть сделано, потому что это хорошо только для шага = 1. Пример - осциллятор между -2 и 3 с шагом 2. Код выше даст -2, 0, 2, 0, -2, 0, 2 и так далее.

Я думаю, это должно быть -2, 0, 2, 2 (1 шаг от 2 до 3 и 1 шаг к возвращению), 0, -2, 0 и т. Д. То же самое для (-4,4, 3). Это должно быть -4, -1, 2, 3, 0, -3, -1 и т. Д. (Исходный код даст -4, -1, 2, -1, -4, ..). Мое предложение (я также добавил еще одну проверку значений параметров)

function oscillator(low, high, inc) {

    // basic test for illegal parameters
    if (low > high || inc < 0 ||  2 * (high - low) < inc) 
        return function() { return NaN; };

    var curr = low;
    return function() {
        var ret = curr;
        curr += inc;

        if (curr > high || curr < low) 
        {   
            curr = inc>0 ? 2 * high - curr: 2 * low - curr;  
            inc = -inc;
        };

        return ret;
    }; 
}
2 голосов
/ 11 февраля 2012

Эта функция возвращает функцию, которая реализует итератор для запрошенных параметров:

function oscillator(low, high, increment) {

    // basic test for illegal parameters
    if (low > high || increment < 0) 
        return function() { return NaN; };

    var curr = low;
    return function() {
        var ret = curr;
        curr += increment;

        // if the next number will exceed the boundaries, reverse the increment
        if (curr + increment > high || curr + increment < low) 
            increment = -increment;

        return ret;
    }; 
}
...