斐波那契负数


28

也许大家都知道斐波那契数列:

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

您的任务非常简单:

  • 给定整数N计算fibonacci(n)

但这是一个转折点:

  • 也做负面的 N

等待。什么?

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

所以

fibonacci(-1)=1

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

等等...

  • 这是一个因此以字节为单位的最短编程赢了。
  • 您可以提交功能或完整程序
  • N在[-100,100]中

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

暗示:

n <0且n&1 == 0:

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


不,我的人也要您支持负数。
罗曼·格拉夫(RomanGräf)

7
我认为这不是骗子。在现有的斐波那契挑战的第一页答案中,只有1个可以解决负面问题,其余所有都需要进行重大更改才能倒退。
xnor

添加了一些。随时添加更多。@Flip
罗马格拉夫

1
阅读有关格式化测试用例的这篇元文章:避免使用花哨的表格
FlipTack

用CSV表示SSV(用分号分隔的值)?
NH。

Answers:


22

Mathematica,9个字节

Fibonacci

是的,此内置函数支持负数。


2
这几乎是逐字逐句的答案,我正要发布:D
格雷格·马丁

17

八度,20字节

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

在线尝试!

说明

这利用了斐波那契序列f(n)可以写成这样的事实(这应该是矩阵向量符号):

递归地:

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

明确地:

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

这意味着此矩阵的右上角项nf(n)我们要寻找的值。显然,由于该矩阵具有完整秩,因此我们也可以将其求逆,并且该关系仍然描述相同的递归关系。这意味着它也适用于负输入。


1
(如何)对负输入也有效吗?
罗曼·格拉夫(RomanGräf)

是的,即将到来的解释……
瑕疵的,2016年

ans(-6)肯定的?
FlipTack

@FlipTack抱歉,可能是因为索引移位。我使用基于1的问题,而问题使用基于0的问题,我现在将其修复。
瑕疵的


11

Python,43个字节

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

具有黄金比例的直接公式g。具有f以上功能:

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

相同长度的alt,仅混叠5的平方根:

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

我没有找到一种可以与这些竞争的递归函数的方法。尝试尝试57个字节:

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

为了进行比较,使用了一种迭代方法(Python 2中为60字节):

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

或者,对于58个字节:

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

10

JavaScript(ES6),42个字节

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

测试


我真的很喜欢你的功能 我在这里有个建议,但我忽略了-,所以就行不通了……
路加福音

5

MATL11 9字节

我对[3,2]肯定可以打高尔夫球感到高兴,如果有人知道一种方法,请让我知道=)(它也可以和[1,3]。一起使用。)感谢@LuisMendo提供的-2 bytes =)

IHhBiY^2)

这使用与八度响应相同的方法。但是要生成矩阵

[1,1]
[1,0]

我们只是将数字转换为十进制,3然后2转换为二进制(即1110)。

在线尝试!


5

JavaScript(ES7)37字节

使用Binet公式

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

这将输出n斐波那契数+- 0.0000000000000005


**需要ES7。
尼尔

哦,以为它是ES6的一部分,但是您是对的。改了 我还使用了Binet公式的另一个版本进行1B保存。
路加福音

现在,我考虑了一下,使用1-p代替-1/p应该可以节省同样的费用。
尼尔

3

Jolf,2个字节

mL

在这里尝试!

内置fibonacci,使用phi公式实现。


未捕获的SyntaxError:意外的令牌| 在新函数(<anonymous>)在p(math.min.js:27)在对象(math.min.js:27)在类型(eval在p(math.min.js:27),在<anonymous>: 36:14)在Object.n [作为工厂](math.min.js:27)在t。(math.min.js:27)在Object.get [在中值](math.min.js:27)[作为中位数](math.min.js:27)克隆(rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902),位于rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf。 js:2128(最新的Google Chrome浏览器,版本55.0.2883.87m)
Ismael Miguel

@IsmaelMiguel这仅适用于Firefox
Conor O'Brien

我不知道,它不在任何地方
Ismael Miguel

2

Haskell,51个字节

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

1
保护中的多个测试可以结合,,而不是&&even z,z<0
nimi

1

的PowerShell,112字节

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

演示电话:

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

演示输出:

-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

Lithp,88个字节

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

我看着所有这些括号

在线尝试!

真的不是很小。当前存在一个解析错误,需要使用(get N)(+ N)代替N。我选择了较小的。但是,我认为没有什么可以做得更多了。

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.