首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要数学方面的帮助才能在CoffeeScript或Javascript中编写振荡迭代器

需要数学方面的帮助才能在CoffeeScript或Javascript中编写振荡迭代器
EN

Stack Overflow用户
提问于 2012-02-11 07:39:16
回答 3查看 266关注 0票数 2

基本上,我想要一个我可以调用的函数,它允许我以指定的增量在一系列数字之间的跳跃循环中迭代。我试过用很多条件来解决复杂的问题,但在我看来,这真的应该是一个简单的数学一行,不是吗?

我在表达我的问题时遇到了一些麻烦,所以这里有一些伪咖啡脚本来更好地解释我的目标。

代码语言:javascript
复制
# 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() #=> ...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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,..)。我的建议是(我还增加了一次对参数值的检查)

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-02-11 08:18:56

此函数返回一个函数,该函数实现所请求参数的迭代器:

代码语言:javascript
复制
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;
    }; 
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-11 08:31:14

与ori类似,但在CoffeeScript中

代码语言:javascript
复制
createOscillator = (low, high, step = 1) ->
  value = low
  ->
    current = value
    value += step
    step *= -1 if value <= low or value >= high
    current

用法

代码语言:javascript
复制
osc = createOscillator 0, 5, 1
console.log osc() for i in [0..10]

打印

代码语言:javascript
复制
0
1
2
3
4
5
4
3
2
1
0

编辑:固定边界条件

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9236379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档