Números negativos de Fibonacci


28

Você provavelmente todos conhecem a sequência de fibonacci:

fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)
fibonacci(0)=0
fibonacci(1)=1

Sua tarefa é a mais simples possível:

  • Dada Ncomputação inteirafibonacci(n)

mas aqui está a reviravolta:

  • Também negativo N

Esperar. O que?

fibonacci(1)=fibonacci(0)+fibonacci(-1)

então

fibonacci(-1)=1

e

fibonacci(-2)=fibonacci(0)-fibonacci(1)=-1

e assim por diante...

  • Este é um pelo que o programa mais curto em bytes ganha.
  • Você pode enviar uma função ou um programa completo
  • N está em [-100,100]

Caso (s) de teste em CSV:

-9;-8;-7;-6;-5;-4;-3;-2;-1;0;1;2;3;4;5;6;7;8
34;-21;13;-8;5;-3;2;-1;1;0;1;1;2;3;5;8;13;21

Dica:

n <0 e n & 1 == 0:

fibonacci(n)=fibonacci(abs(n))*-1


Não. O meu também quer que você suporte números negativos.
— Roman Gräf

7
Eu acho que isso não é uma bobagem. Das respostas na primeira página do desafio existente de Fibonacci, apenas 1 pode lidar com negativos, e todo o resto precisaria ser significativamente alterado para retroceder também.
— xnor

Adicionado alguns. Sinta-se livre para adicionar mais. @Flip
— Roman Gräf

1
Leia este meta post sobre como formatar casos de teste: tente evitar tabelas sofisticadas
— FlipTack 31/12/16

e por CSV você quer dizer SSV (valores separados por ponto e vírgula)?
— NH.

Respostas:


22

Mathematica, 9 bytes

Fibonacci

Sim, esta função interna suporta números negativos.


2
Essa é quase a palavra por palavra a resposta que eu estava postando: D
— Greg Martin

17

Oitava, 20 bytes

 @(n)([1,1;1,0]^n)(2)

Experimente online!

Explicação

Isso faz uso do fato de que a sequência de fibonacci f(n)pode ser escrita como (essa deve ser uma notação de vetor de matriz):

Recursivamente:

[f(n+1)]  = [1  1] * [f(n)  ]
[f(n)  ]    [1  0]   [f(n-1)]

Explicitamente:

[f(n+1)]  = [1  1] ^n * [1]
[f(n)  ]    [1  0]      [0]

Isso significa que a entrada superior direita dessa matriz à potência de né o valorf(n) que estamos procurando. Obviamente, também podemos inverter essa matriz, pois ela possui uma classificação completa, e o relacionamento ainda descreve a mesma relação de recorrência. Isso significa que também funciona para entradas negativas.


1
(Como) Isso também funciona para dados negativos?
— Roman Gräf

Sim, a explicação está chegando ...
— flawr 31/12/16

está ans(-6)destinado a ser positivo?
— FlipTack 31/12/16

@ FlipTack Desculpe, pode ter sido por causa da mudança de índice. Eu usei 1, enquanto a pergunta usava 0, eu o corrigi agora.
— flawr


11

Python, 43 bytes

g=5**.5/2+.5
lambda n:(g**n-(1-g)**n)/5**.5

Uma fórmula direta com a proporção áurea g. Com fa função acima:

for n in range(-10,11):print f(n) 

-55.0
34.0
-21.0
13.0
-8.0
5.0
-3.0
2.0
-1.0
1.0
0.0
1.0
1.0
2.0
3.0
5.0
8.0
13.0
21.0
34.0
55.0

Mesmo comprimento alt, apenas com o alias da raiz quadrada de 5:

a=5**.5
lambda n:((a+1)**n-(1-a)**n)/a/2**n

Não vi uma maneira de criar uma função recursiva que pudesse competir com elas. Uma tentativa moderada de 57 bytes:

f=lambda n:n<0and(-1)**n*f(-n)or n>1and f(n-1)+f(n-2)or n

Para comparação, um método iterativo (60 bytes em Python 2):

n=input()
a,b=0,1;exec"a,b=b,a+b;"*n+"a,b=b-a,a;"*-n
print a

Ou, para 58 bytes:

n=input()
a,b=0,1;exec"a,b=b,a+cmp(n,0)*b;"*abs(n)
print a

10

JavaScript (ES6), 42 bytes

f=n=>n<2?n<0?f(n+2)-f(n+1):n:f(n-2)+f(n-1)

Teste


Eu realmente gosto da sua função. Eu tive uma sugestão aqui, mas negligenciei um -, para que não funcionasse ... #
— 314 Luke #

5

MATL , 11 9 bytes

Estou feliz com o [3,2], que certamente poderia ser jogado, se alguém souber uma maneira, por favor me avise =) (Também funcionaria [1,3].) Obrigado @LuisMendo por -2 bytes =)

IHhBiY^2)

Isso está usando a mesma abordagem que a resposta do Octave . Mas para gerar a matriz

[1,1]
[1,0]

nós apenas convertemos o número 3e 2de decimal para binário (ie 11e 10).

Experimente online!


5

JavaScript (ES7) 37 bytes

Usa a fórmula de Binet .

n=>((1+(a=5**.5))**n-(1-a)**n)/a/2**n

Isso gera o número nth de Fibonacci + - 0.0000000000000005.


**requer ES7.
— 31516 Neil

Oh, pensei que fazia parte do ES6, mas você está certo. Mudou isso. Também usei outra versão da fórmula de Binet para salvar 1B.
— Luke

Agora que penso nisso, apenas usar em 1-pvez de -1/pdeveria ter funcionado para a mesma economia.
— Neil

3

Jolf, 2 bytes

mL

Experimente aqui!

O fibonacci embutido, implementado usando a phifórmula.


SyntaxError não capturado: token inesperado | em new Function (<anonymous>) em p (math.min.js: 27) em Object (math.min.js: 27) em digitado (eval em p (math.min.js: 27), <anonymous>: 36:14) em Object.n [como fábrica] (math.min.js: 45) em t (math.min.js: 27) em f (math.min.js: 27) em Object.get [como mediana ] (math.min.js: 27) no clone (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) em rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf. js: 2128 (mais recente do Google Chrome, versão 55.0.2883.87m)
— Ismael Miguel

@IsmaelMiguel Isso só deve trabalhar no firefox
— Conor O'Brien

Eu não tinha idéia, não é em qualquer lugar
— Ismael Miguel

2

Haskell, 51 bytes

s=0:scanl(+)1s;f z|even z,z<0= -f(-z);f z=s!!abs z

1
Vários testes dentro de um guarda pode ser combinado com ,em vez de &&: even z,z<0.
— N

1

PowerShell , 112 bytes

function f($n){$o=('-','+')[$n-lt0];&(({$a,$b=(2,1|%{f("$n$o$_"|iex)});"$a- $o$b"|iex},{$n*$n})[$n-in(-1..1)])}

Chamada de demonstração:

-9..9 | %{"{0,2}`t=> {1,3}" -f $_,(f($_))} 

Saída da demonstração:

-9  =>  34
-8  => -21
-7  =>  13
-6  =>  -8
-5  =>   5
-4  =>  -3
-3  =>   2
-2  =>  -1
-1  =>   1
 0  =>   0
 1  =>   1
 2  =>   1
 3  =>   2
 4  =>   3
 5  =>   5
 6  =>   8
 7  =>  13
 8  =>  21
 9  =>  34

1

Lit , 88 bytes

#N::((if(< N 2)((if(< N 0)((-(f(+ N 2))(f(+ N 1))))((+ N))))((+(f(- N 2))(f(- N 1))))))

Meu olhar para todos esses parênteses .

Experimente online!

Na verdade, não é muito pequeno. Atualmente, existe um erro de análise que requer um uso (get N)ou em (+ N)vez de simplesmente N. Eu escolhi o menor. No entanto, acho que não há nada que possa ser feito ainda mais para jogar golfe.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.