Наиболее краткий способ перечисления нулевых пересечений конкретной спирали - PullRequest
1 голос
/ 28 октября 2011

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

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

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

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

closed form

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

1 голос
/ 28 октября 2011

С C-нотацией f(n) будет n % 2 == 0 ? -n/2 : (n+1)/2, то есть:

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

1 голос
/ 28 октября 2011

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

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)
...