循环计数到100再返回0,然后再次计数到100,如此往复。

6

我必须承认,我不是一个数学专家,这就是为什么我不能满意地解决以下问题。

我有一个数字,比如i=0。我有一个函数,每次调用时将i增加1,然后再次调用自身,再增加一次,再增加一次...当达到100时,我想让它倒数到0,然后再次上升,就像一个无限循环,i像电梯一样上下移动。有什么优雅的解决方案吗?

我的解决方案:

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()

我在寻找更短的东西。


应该(希望)在计数之间存在一些延迟吗?否则你的环境将会崩溃。 - RightSaidFred
是的,请不要尝试运行这段代码,它只是为了展示想法。 - Björn
4个回答

6

我认为看起来还不错,但可能会卖掉你的狗并偷走你的啤酒:

var direction = 1;
var i = 0;

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

看起来很紧凑,i % 100 做什么? - Björn
1
除以100并返回余数。 - Arjan
运行此代码会产生“未捕获的SyntaxError:意外的令牌)”一个括号太多了...方向 *= ((i%100 == 0)?-1:1) - Björn

4
表达式abs((i%200) - 100)会在i增加时生成所需的锯齿形图案。因此,像这样的东西:
var i = 100;
while (1) {
    var j = Math.abs((i % 200) - 100);
    // Use j
    // ...
    i += 1;
}

3
您可以使用一个变量来添加或减少数量,如果它是正数或负数。因此,您只需更改变量的符号即可。
var countingUp = 1;
var i = 0;

function count() {

    i += (1 * countingUp);

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

这里是演示。

为了避免无限递归,只需使用 setInterval()。

window.setInterval( count, 1 );

无限递归...while循环...对我来说都一样(好吧,不完全一样,因为JS运行时不支持尾递归 :( ) - hugomg
@missingno 只需使用 setInterval 并避免在同一函数内调用相同的函数... 请查看我编辑过的 fiddle。 - Jose Faeti

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接