Наиболее краткий способ перечисления пересечений нулей конкретной спирали

#algorithm #abstract #pseudocode

#алгоритм #аннотация #псевдокод

Вопрос:

Какой наиболее краткий способ (в псевдокоде) создать следующее отображение f из натуральных чисел в целые числа f(0) = 0; f(1) = 1; f(2) = -1; f(3) = 2; f(4) = -2; f(5) = 3; и т. д

Вы можете представить их как пересечение нуля двойной симметричной архимедовой спирали.

О, и математика с плавающей запятой не допускается! Математика с плавающей запятой была бы … уродливой в этой ситуации.

Ответ №1:

Wolfram Alpha нашел замкнутую форму для вычисления n-го члена напрямую:

замкнутая форма

Выражение -1 n также может быть записано так, как (n % 2 == 0 ? 1 : -1) если бы n было положительным целым числом.

Ответ №2:

Не красиво, но однострочный, который работает и не использует условные обозначения:

 f(i):
  f := (2 * (i mod 2) - 1) * ((i   1) >> 1)
 

Конечно, с использованием условных выражений он становится более читаемым:

 f(i):
  if (i mod 2) is
    0: f := -((i   1) >> 1)
    1: f :=  ((i   1) >> 1)
 

Ответ №3:

С помощью C-нотации f(n) будет n % 2 == 0 ? -n/2 : (n 1)/2 , т.е.:

Если n четно, то -n/2 , если n нечетно, то (n 1)/2