Увеличьте, когда меньше чем, уменьшите, когда меньше чем - PullRequest
0 голосов
/ 04 февраля 2010

Из любопытства, есть ли (независимый от языка *) способ превратить эти два общих утверждения в одно утверждение?

if (a < b) a += x;
else if (a > b) a -= x;

Может также использоваться как

if (abs(b - a) < x) a = b;
else if (a < b) a += x;
else if (a > b) a -= x;

О, теперь, когда я пишу это, я думаю о чем-то вроде этого:

if (a != b) a += x * (a < b ? 1 : -1);

Но это не очень помогает удобочитаемости. Возможно, другими способами?

  • = Нормальные языки, не Brainfuck и подобные или действительно древние

Ответы [ 4 ]

6 голосов
/ 04 февраля 2010
a += x * sgn(b-a)

Где sgn - функция знака:

sgn x | x > 0      = 1
      | x < 0      = -1
      | otherwise  = 0
3 голосов
/ 04 февраля 2010

Вы действительно должны задаться вопросом, зачем вам это нужно, компилятор выполнит хорошую оптимизацию, и данное утверждение очень читабельно.

1 голос
/ 04 февраля 2010

Независимо от языка, это немного сложно, но если у вас есть cmp или подобное, вы можете использовать это:

a += x * cmp(b, a)

cmp (b, a) возвращает:

  • 0если b == a
  • 1, если b> a
  • -1, если a

Также в предложенной вами реализации есть ошибка:

a = 9;
b = 10;
x = 2;

if (a < b) a += x;
if (a > b) a -= x;

print a;

Вывод: 9 (ожидается 11)

Вам нужен else, чтобы это исправить.В качестве альтернативы, если вы хотите, чтобы a не проходил мимо b, сделайте следующее:

if (a < b)
{
   a = min(b, a + x);
}
else if (a > b)
{
   a = max(b, a - x);
}

Если вы хотите сделать это в одном выражении, вы можете:

a = (a < b) ? min(b, a + x) : max(b, a - x);

Iдумаю, первый способ яснее.

0 голосов
/ 04 февраля 2010
a += (b - a) / abs(b - a) * x

Но это не зависит от языка и не очень помогает в готовности, если вы спросите меня ...

...