枚举特定螺旋的零交叉的最简洁方法

发布于 2024-12-12 05:09:34 字数 181 浏览 0 评论 0原文

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

您可以将它们想象为双对称阿基米德螺旋的零交叉点。

哦,不允许使用浮点数学!在这种情况下,浮点数学会......很难看。

What is the most succinct way (in pseudocode) to create the following map f from the naturals to the integers
f(0) = 0;
f(1) = 1;
f(2) = -1;
f(3) = 2;
f(4) = -2;
f(5) = 3;
etc

You can imagine them as the zero crossing of a double symmetric Archimedean spiral.

Oh, and no float math allowed! Float math would be... ugly in this situation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

涫野音 2024-12-19 05:09:35

Wolfram Alpha 找到了直接计算第 nth 项的封闭形式:

封闭形式

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

Wolfram Alpha found a closed form for calculating the nth term directly:

closed form

The expression -1n can also be written as (n % 2 == 0 ? 1 : -1) if n is a positive integer.

梦断已成空 2024-12-19 05:09:35

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

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)

Not pretty, but an one-liner that works and doesn't use conditionals:

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

Of course, using conditionals, it gets more readable:

f(i):
  if (i mod 2) is
    0: f := -((i + 1) >> 1)
    1: f :=  ((i + 1) >> 1)
黑寡妇 2024-12-19 05:09:35

使用 C 表示法,f(n) 将是 n % 2 == 0 ? -n/2 :(n+1)/2,即:

如果n是偶数则-n/2,如果n code> 是奇数则 (n+1)/2

With C-notation, f(n) will be n % 2 == 0 ? -n/2 : (n+1)/2, i.e.:

If n is even then -n/2, if n is odd then (n+1)/2

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文