負のフィボナッチ数


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


いいえ。Mineは、負の数もサポートしてほしいと考えています。
ローマングラフ

7
これはだまされていないと思います。既存のフィボナッチチャレンジの最初のページにある回答のうち、ネガを処理できるのは1つだけであり、残りのすべても後戻りするには大幅に変更する必要があります。
xnor

いくつか追加しました。さらに追加してください。@フリップ
ローマン

1
テストケースのフォーマットに関するこのメタ投稿を読む:派手なテーブルを避けるようにしてください
FlipTack

CSVではSSV(セミコロンで区切られた値)を意味しますか?
NH。

回答:



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]

つまり、この行列の右上のエントリnは、f(n)探している値です。明らかに、この行列にはフルランクがあるため、この行列を逆にすることもできます。関係は同じ繰り返し関係を示します。つまり、負の入力に対しても機能します。


1
(方法)これは負の入力に対しても機能しますか?
ローマングラフ

はい、説明が来て...
flawr

されるans(-6)正であることを意図?
FlipTack 16

@FlipTack申し訳ありませんが、それはインデックスシフトのせいかもしれません。私は1ベースを使用しましたが、質問は0ベースを使用していましたが、今では修正しました。
flawr 16


11

Python、43バイト

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

黄金比を持つ直接式gf上記の機能により:

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]誰もが道を知っている場合()私は=を教えてください、きっとgolfedすることができた、それだろうとも仕事[1,3]。) -2バイト=のおかげでの@LuisMendo)

IHhBiY^2)

これは、Octave annswerと同じアプローチを使用しています。しかし、行列を生成するには

[1,1]
[1,0]

私たちはCONVER数32小数のバイナリ(すなわちへ1110)。

オンラインでお試しください!


5

JavaScript(ES7)37バイト

ビネットの式を使用ます。

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

これはnthフィボナッチ数+-を出力します0.0000000000000005


**ES7が必要です。
ニール

ああ、それはES6の一部だと思ったが、あなたは正しい。変更しました。また、1Bの保存に別のバージョンのBinetの式を使用しました。
ルーク

今考えてみると、1-p代わりに使用するだけで-1/p同じ節約に機能するはずです。
ニール

3

Jolf、2バイト

mL

ここで試してみてください!

phi式を使用して実装されたフィボナッチ組み込み関数。


Uncaught SyntaxError:予期しないトークン| 新しい関数(<anonymous>)at p(math.min.js:27)at Object(math.min.js:27)at typed(eval at p(math.min.js:27)、<anonymous>: 36:14)Object.n [工場として](math.min.js:45)at t(math.min.js:27)at f(math.min.js:27)at Object.get [as median ](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)
イスマエルミゲル

@IsmaelMiguelこれはFirefoxでのみ動作するはずです
コナーオブライエン

どこにもない
イスマエルミゲル

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ます。私は小さい方を選びました。しかし、これをゴルフするためにさらにできることはないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.