Если у вас есть идентификатор лампочки в диапазоне от 0 до 4, лучший способ получить следующий и предыдущий идентификаторы - использовать:
next = (id + 1) % 5
prev = (id + 4) % 5
Это не зависит от языка, поскольку не все языки обрабатывают операторы модулей для отрицательных чисел одинаково. Вы можете видеть, что шаг вперед 4 из 4 (например) дает вам: 0, 1, 2, 3, что равно шагу назад.
Тем не менее. модуль действительно работает только с нулевыми значениями. Поскольку у вас есть однозначные значения, вы можете сначала вычесть одно, сделать соответствующее сложение / по модулю, а затем снова добавить одно.
next = ((id - 1) + 1) % 5 + 1
prev = ((id - 1) + 4) % 5 + 1
Это упрощает до:
next = id % 5 + 1
prev = (id + 3) % 5 + 1
Используя эту формулу, вы получите:
id next prev
-- ---- ----
1 2 5
2 3 1
3 4 2
4 5 3
5 1 4
как и ожидалось.
Это примерно настолько же оптимизировано, насколько вы, вероятно, получите без справочной таблицы. Вы можете использовать тот же подход для любого размера переворачивания (не только 5), вам просто нужно изменить модуль и то, что вы добавляете.
Если индексы варьируются от 1 до N
, то это:
next = id % [N] + 1
prev = (id + [N-2]) % [N] + 1
где цифры внутри []
являются постоянными в зависимости от количества индексов.