2012-02-10 30 views
2

基本上,我想要一个函数,我可以调用它,让我通过指定增量在一系列数字之间的弹跳循环中进行迭代。我已经尝试过用多种条件来复杂的解决方案,但在我看来,这应该是一个简单的数学单线程否?需要数学帮助,以CoffeeScript或Javascript编写振荡迭代器。

我在制定我的问题时遇到了一些麻烦,所以这里有一些伪coffescript来更好地解释我的目标。

# 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() #=> ... 
+0

我开始认为条件并不是那么糟糕。见: https://gist.github.com/1793937 – Quickredfox 2012-02-11 00:17:27

回答

2

我稍微修改由ORI写的版本。我认为这是振荡器应该具备的一种行为。改变增量符号以从边界反弹只是应该完成的一部分,因为它仅适用于step = 1。示例 - 使用步骤2在-2和3之间振荡。上面的代码将给出-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; 
    }; 
} 
+0

这个答案确实修复了我用Ori的函数遇到的一些错误。谢谢。 – Quickredfox 2012-02-13 14:16:28

2

该函数返回实现所要求的参数迭代函数:

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; 
    }; 
} 
+0

这个工程。我甚至测试了一个负值到正范围(-9,9,1)......除非有人在一些内部提出了一个神奇的模/正弦/余弦公式,我一定会将其标记为正确答案。 – Quickredfox 2012-02-11 01:15:04

+1

@Quickredfox罪恶或cos在这里不会帮助:) – Cheery 2012-02-11 07:18:42

+0

在周末摆弄这个之后,我倾向于同意。 – Quickredfox 2012-02-13 14:14:08

2

像ORI的除了在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 

编辑:固定边界条件

+0

看到Ori是第一个,我会给他答案,但道具给你,现在我可以剪切和粘贴;) – Quickredfox 2012-02-11 01:12:04