基本上,我想要一个我可以调用的函数,它允许我以指定的增量在一系列数字之间的跳跃循环中迭代。我试过用很多条件来解决复杂的问题,但在我看来,这真的应该是一个简单的数学一行,不是吗?
我在表达我的问题时遇到了一些麻烦,所以这里有一些伪咖啡脚本来更好地解释我的目标。
# 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() #=> ...发布于 2012-02-11 16:32:16
我稍微修改了由ori编写的版本。我认为这是振荡器应该具备的一种行为。将增量的符号更改为从边界反弹只是应该做的一部分,因为它只对step =1有效。示例-2和3之间的振荡器,步骤2。上面的代码将给出-2,0,2,0,-2,0,2等等。
我认为它应该是-2,0,2,2(从2到3的1步和返回的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;
};
}发布于 2012-02-11 08:18:56
此函数返回一个函数,该函数实现所请求参数的迭代器:
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;
};
}发布于 2012-02-11 08:31:14
与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编辑:固定边界条件
https://stackoverflow.com/questions/9236379
复制相似问题