交流功率斐波那契数列


24

定义

交流功率斐波那契数列形成如下。

  1. 从空序列开始,并将n设置为1

  2. 用重复计算第n 非负斐波那契数f n0是第一个,1是第二个,第三个,2是第四个。所有其他值都是通过将序列中的前两个数字相加得出的,因此3 = 1 + 2是第五个,5 = 2 + 3是第六个,依此类推。

  3. 如果n为奇数,则更改f n的符号。

  4. f n的2 n-1个副本附加到序列中。

  5. 递增n并返回到步骤2。

这些是APF序列的前一百个术语。

 0  1  1 -1 -1 -1 -1  2  2  2  2  2  2  2  2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
 5  5  5  5  5  5  5  5  5  5  5  5  5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8

任务

编写一个完整的程序或函数,将正整数n作为输入并打印或返回APF序列的n 项。

如果您更喜欢从0开始的索引,则可以选择使用非负整数n并在索引n处打印或返回APF编号。

这是;以字节为单位的最短代码可能会获胜!

测试用例(基于1)

    1 ->    0
    2 ->    1
    3 ->    1
    4 ->   -1
    7 ->   -1
    8 ->    2
  100 ->   -8
  250 ->   13
  500 ->  -21
 1000 ->   34
11111 ->  233
22222 -> -377
33333 ->  610

测试用例(从0开始)

    0 ->    0
    1 ->    1
    2 ->    1
    3 ->   -1
    6 ->   -1
    7 ->    2
   99 ->   -8
  249 ->   13
  499 ->  -21
  999 ->   34
11110 ->  233
22221 -> -377
33332 ->  610

n是否有任何限制?
Okx

2
只要您的算法适用于任意大的n值,就可以假定它适合您的数据类型。
丹尼斯,

1
这有OEIS号吗?
Mindwin'2

@Mindwin事实并非如此。
丹尼斯

Answers:


12

果冻,5 个字节

BLCÆḞ

在线尝试!

怎么样?

将斐波那契数列扩展成负索引,以便该关系f(i) = f(i-2) + f(i-1)仍然成立:

  i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ...

i=0这些数字返回的数字是我们需要重复2 n-1次的数字,而Jelly的内置Fibonacci ÆḞ将会计算这些数字。

-i通过取的位长n并减去,可以找到所需的(正数)1

由于我们希望i(负数),我们可以改为执行1-bitLength和果冻具有用于原子1-xC,补体单子。

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21

我知道有一种更短的方法,但不是那么多,我认为这是7个字节,并且可以删除,µ并且
英里

但是,您反复的否定很聪明,我一直在查看负一的幂,这会增加几个字节,直到我回想起负的斐波那契值并将其插入Jelly的monad中。
乔纳森·艾伦

4
老实说,我很惊讶,果冻没有一个字节的内置字节来获取数字的二进制长度...
ETHproductions

22

Python 2,30个字节

f=lambda n:n<1or f(n/4)-f(n/2)

在线尝试!

一索引。

序列感觉就像一个难题,这是丹尼斯通过简短的表达方式产生的。2的幂次方的重复表示通过移位(2的底除)进行递归。交替符号Fibonacci递归f(n)=f(n-2)-f(n-1)可以适用于移位而不是递减。基本情况下效果很好,因为所有内容都集中到n=0


6

Mathematica,43 36 24字节

Fibonacci@-Floor@Log2@#&

@GregMartin节省了7个字节,@ JungHwanMin节省了12个字节。


1
您可以通过Floor@Log2@#和写入Fibonacci[t=...](以及通过删除最后一个指数中的空格)来节省几个字节。
格雷格·马丁

1
-12个字节:Fibonacci@-Floor@Log2@#&- Fibonacci也可以接受否定参数(为您照顾符号)。
JungHwan Min'2

5

MATL19 17 16 11字节

lOiB"yy-]x&

输入基于1。

在线尝试!验证所有测试用例

怎么运行的

对于基于1的输入n,令mn的二进制扩展中的位数。该Ñ在输出序列个项是在Fibonacci序列中第术语,可能具有其符号改变。

一种想法是迭代m次以计算斐波那契数列的项。for each使用二进制数字数组进行循环很容易。如果斐波纳契数列以0初始化,则照常初始化1,则m次迭代将导致堆栈上有m + 2个项,因此必须删除前两个数字。相反,我们先初始化1,然后初始化0。这样,在未来产生的条件是112,...,只有一个缺失是必要的。

可以通过使用另一个循环将符号更改m次来处理该符号。但这很昂贵。最好将两个循环集成在一起,这只需通过减去而不是在斐波那契迭代中进行相加即可完成。

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack

4

JavaScript(ES6),33个字节

f=(n,p=1,c=0)=>n?-f(n>>1,c,p+c):p

1个索引。

的端口XNOR的回答将是23:

f=n=>n<1||f(n/4)-f(n/2)


3

果冻,9个字节

BLµ’ÆḞN⁸¡

使用基于一的索引。

在线尝试!

说明

如果您的斐波那契函数仅支持非负参数,则此方法有效。

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1)

3

Japt,6个字节

Mg1-¢l

在线测试!

怎么运行的

正如在其他的答案中提到,在ñ 在交流迹象斐波纳契数列项是一样的-n 在常规系列项。n可通过取输入的位长并减去1来找到;取反将导致1减去位长。

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index.

3

05AB1E11 10字节

使用基于1的索引

05AB1E的Fibonacci函数返回小于n的正数fib数,这意味着我们必须生成比必要数更多的正数,然后通过索引获取正确的数字,然后计算符号。因此,我怀疑以此为基础的任何方法都不会比迭代计算数字短。

使用我们可以使用Luis Mendo的MATL answer中所述的1, 0反向初始化堆栈的方式来处理这种情况。n=1

XÎbgG‚D«`-

在线尝试!

说明

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements

2

Perl 6、53字节

{flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]}

序列的直接实现,描述的方式。
从零开始。


2

朱莉娅0.5,19字节

!n=n<1||!(n/=4)-!2n

在线尝试!

怎么运行的

它使用与@xnor的Python answer相同的公式。递归关系
g(n)= g(n-2)+ g(n-1)生成斐波那契数列的负项,该负项等于带有交替符号的正项。从在一个运行的任何地方2次ķ相同数量的重复,我们可以挑选的先前运行的任何重复2 k-1个数字和的运行2 K-2由通过将索引那些之前的数字24

而不是简单明了

f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes

我们可以为我们的目的重新定义一个运算符。同样,f与浮点数一样好,所以我们得到

!n=n<1||!(n/4)-!(n/2)   # 21 bytes

最后,如果我们用除以4的值更新n,我们可以将n / 2写为2n并省略一对括号,从而在此答案中得到19字节的函数定义。


1

J,18个字节

(%>:-*:)t.@<:@#@#:

使用基于一的索引。取n > 0 的输入整数,并floor(log2(n))通过找到其二进制表示形式的长度进行计算,然后将该值减1。然后找到生成函数的floor(log2(n))-1th系数x /(1 + x - x 2)是负索引斐波那契值的gf。

在线尝试!

说明

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.