Как бы вы перебрали следующие серии в Javascript / jQuery:
1, -2, 3, -4, 5, -6, 7, -8, ...
Вот как я это делаю:
n = 1 while (...) { n = ((n % 2 == 0) ? 1 : -1) * (Math.abs(n) + 1); }
Есть ли более простой метод?
Вы можете оставить две переменные:
for (var n = 1, s = 1; ...; ++n, s = -s) alert(n * s);
Это проще
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);
Как насчет:
var n = 1; while(...) n = n < 0 ? -(n - 1) : -(n + 1);
Это выглядит правильно, не намного проще, чем это. Хотя вы можете использовать n < 0, если начинаете с n = 1 вместо n % 2 == 0, что обычно является более медленной операцией.
n < 0
n = 1
n % 2 == 0
В противном случае вам понадобятся две переменные.
Как насчет Манипулирования битами -
n = 1; while(...) { if(n&1) cout<<n<<","; else cout<<~n+1<<","; }
Ничто не сравнится с битами !!
for (var n = 1; Math.abs(n) < 10; (n ^= -1) > 0 && (n += 2)) console.log (n);
Вы всегда можете просто использовать следующий метод:
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)
while (...) { if (n * -1 > 0) { n -= 1; } else { n += 1; } n *= -1; }
кажется самым простым способом.