Как перебирать серии: 1, -2, 3, -4, 5, -6, 7, -8, ...? - PullRequest
3 голосов
/ 05 июня 2011

Как бы вы перебрали следующие серии в Javascript / jQuery:

1, -2, 3, -4, 5, -6, 7, -8, ...

Вот как я это делаю:

n = 1
while (...) {
  n = ((n % 2 == 0) ? 1 : -1) * (Math.abs(n) + 1);
}

Есть ли более простой метод?

Ответы [ 8 ]

11 голосов
/ 05 июня 2011

Вы можете оставить две переменные:

for (var n = 1, s = 1; ...; ++n, s = -s)
  alert(n * s);
4 голосов
/ 05 июня 2011

Это проще

x = 1;
while (...) {
    use(x);
    x = - x - x / Math.abs(x);
}

или

x = 1;
while (...) {
    use(x);
    x = - (x + (x > 0)*2 - 1);
}

или намного проще (если вам не нужно действительно «увеличивать» переменную, а просто использовать значение)

for (x=1; x<n; x++)
    use((x & 1) ? x : -x);
2 голосов
/ 05 июня 2011

Как насчет:

var n = 1;
while(...)
    n = n < 0 ? -(n - 1) : -(n + 1);
2 голосов
/ 05 июня 2011

Это выглядит правильно, не намного проще, чем это. Хотя вы можете использовать n < 0, если начинаете с n = 1 вместо n % 2 == 0, что обычно является более медленной операцией.

В противном случае вам понадобятся две переменные.

0 голосов
/ 09 мая 2013

Как насчет Манипулирования битами -

n = 1;
while(...)
{
    if(n&1)
    cout<<n<<",";
    else
    cout<<~n+1<<",";
}

Ничто не сравнится с битами !!

0 голосов
/ 05 июня 2011
for (var n = 1; Math.abs(n) < 10; (n ^= -1) > 0 && (n += 2))
   console.log (n);
0 голосов
/ 05 июня 2011

Вы всегда можете просто использовать следующий метод:

for (var i = 1; i < 8; i++) {
  var isOdd = (i % 2 === 1);
  var j = (isOdd - !isOdd) * i;
}

Что, кстати, похоже на то, как вы получите знак (три состояния -1, 0 или 1) числа в JavaScript:

var sign = (num > 0) - (num < 0)
0 голосов
/ 05 июня 2011

Как насчет:

while (...) 
{ 
    if (n * -1 > 0) { n -= 1; }
    else { n += 1; } 

    n *= -1;
}

кажется самым простым способом.

...