2012-02-10 35 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