Algorithm 枚举特定螺旋的过零点的最简洁的方法

Algorithm 枚举特定螺旋的过零点的最简洁的方法,algorithm,abstract,pseudocode,Algorithm,Abstract,Pseudocode,在伪代码中,创建以下从自然数到整数的映射f最简洁的方法是什么 f(0)=0; f(1)=1; f(2)=-1; f(3)=2; f(4)=-2; f(5)=3; 等 你可以把它们想象成双对称阿基米德螺线的零交点 哦,不允许浮动数学!浮动数学将是。。。在这种情况下很难看。找到了一种直接计算第n项的封闭形式: 如果n是正整数,表达式-1n也可以写成(n%2==0?1:-1)。找到了一个用于直接计算第n项的闭合形式: 如果n是一个正整数,表达式-1n也可以写成(n%2==0?1:-1)。不漂亮,但

在伪代码中,创建以下从自然数到整数的映射f最简洁的方法是什么 f(0)=0; f(1)=1; f(2)=-1; f(3)=2; f(4)=-2; f(5)=3; 等

你可以把它们想象成双对称阿基米德螺线的零交点

哦,不允许浮动数学!浮动数学将是。。。在这种情况下很难看。

找到了一种直接计算第n项的封闭形式:

如果n是正整数,表达式-1n也可以写成
(n%2==0?1:-1)

找到了一个用于直接计算第n项的闭合形式:


如果n是一个正整数,表达式-1n也可以写成
(n%2==0?1:-1)

不漂亮,但它是一个有效且不使用条件的一行程序:

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)

不漂亮,但是一行代码可以工作并且不使用条件:

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)
使用C表示法,
f(n)
将是
n%2==0-n/2:(n+1)/2
,即:

如果
n
是偶数,那么
-n/2
,如果
n
是奇数,那么
(n+1)/2
用C表示法,
f(n)
将是
n%2==0-n/2:(n+1)/2
,即:

如果
n
为偶数,则
-n/2
,如果
n
为奇数,则
(n+1)/2