2011-11-29 99 views
6

我必須承認,我不是一個數學專家,這就是爲什麼我無法解決以下問題,我滿意。循環計數到100再回到0再次到100等

我有一個數字,說我= 0。我有一個函數,使每次通話時i增加1,然後再次調用自己,增加另一次和另一次...當達到100時,我希望它倒數到0,然後再次起來,有點像一個endles我像電梯一樣上下跳動。這是一個優雅的解決方案嗎?

我到目前爲止的解決方案:

var countingUp = true; 
var i = 0; 

function count() { 
if(i < 100 && countingUp) {i+=1} 
if(i > 1 && !countingUp) {i-=1} 

if(i===100) {countingUp=false;} 
if(i===1) {countingUp=true;} 

count() 
} 
count() 

我在尋找的東西更短。

+0

如果有(我希望)是數之間的一些延遲?否則你的環境就會鎖定。 – RightSaidFred

+0

是的,不要嘗試這個代碼,它只是爲了顯示這個想法。 – Hans

回答

6

看起來沒給我,但可能會出售你的狗爲奴,竊取你的啤酒:

var direction = 1; 
var i = 0; 

function count() { 
    i += direction; 
    direction *= (((i % 100) == 0) ? -1 : 1); 
} 
+0

看起來很緊張,我%100做什麼? – Hans

+1

除以100並返回餘數 – Arjan

+0

運行此代碼產生「未捕獲的SyntaxError:意外的標記)「一個方括號... ...方向* =((i%100 == 0)?-1:1) – Hans

3

如果是正數或負數,您可以有一個變量來增加或減少金額。所以你只需要改變可變符號。

var countingUp = 1; 
var i = 0; 

function count() { 

    i += (1 * countingUp); 

    if (i == 100 || i == 0) 
    { 
     countingUp *= -1; 
    } 
} 

fiddle here.

爲了避免無限循環,只需使用一個的setInterval()。

window.setInterval(count, 1); 
+0

無限遞歸在那裏...計數呼叫計數呼叫計數... –

+0

無限遞歸... while循環...對我來說同樣的事情(確定,不是因爲JS運行時不支持尾遞歸:() – hugomg

+0

@missingno只是使用setInterval,並避免在同一函數內調用相同的函數...檢查我編輯的小提琴 –

1

只是爲了好玩:

function createCounter(min,max) { 
    var dir = -1, val = min; 
    return function() { return val += ((val >= max || val <= min) ? dir=-dir : dir); } 
} 

,然後用它

var counter = createCounter(0,5); 
counter(); // 1 
counter(); // 2 
counter(); // 3 
counter(); // 4 
counter(); // 5 
counter(); // 4 
counter(); // 3 
counter(); // 2 
counter(); // 1 
counter(); // 0 
counter(); // 1 
counter(); // 2 
4

表達式abs((i % 200) - 100)使鋸齒圖案,你想要的,因爲我增加。

所以後來是這樣的:

var i = 100; 
while (1) { 
    var j = Math.abs((i % 200) - 100); 
    // Use j 
    // ... 
    i += 1; 
}