Negatif Fibonacci Sayıları


28

Muhtemelen hepiniz fibonacci dizisini biliyorsunuzdur:

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

Göreviniz olabileceği kadar basit:

  • Verilen tamsayı Nhesaplamasıfibonacci(n)

ama işte twist:

  • Ayrıca negatif yapmak N

Bekleyin. Ne?

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

yani

fibonacci(-1)=1

ve

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

ve bunun gibi...

  • Bu bir golfüdür ve baytlarda kazanılan en kısa programdır.
  • Bir işlev veya tam bir program gönderebilirsiniz
  • N, [-100,100]

CSV'de Test Çantaları:

-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

İpucu:

n <0 ve n & 1 == 0:

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


Hayır. Benimki de negatif sayıları desteklemeni istiyor.
Roman Gräf

7
Bence bu bir dupe değil. Mevcut Fibonacci mücadelesinin ilk sayfasındaki cevaplardan yalnızca 1 tanesi negatifleri kaldırabilir ve geri kalanların da geriye gitmeleri için önemli ölçüde değiştirilmesi gerekir.
xnor

Biraz ekledim. Daha fazla eklemek için çekinmeyin. @Flip
Roman Gräf

1
Test vakalarını biçimlendirme hakkında bu meta
yazıyı

ve CSV ile SSV (noktalı virgülle ayrılmış değerler) mi demek istiyorsunuz?
NH.

Yanıtlar:


22

Mathematica, 9 bayt

Fibonacci

Evet, bu yerleşik işlev negatif sayıları destekler.


2
Bu neredeyse kelime yazmak için yazdığım cevap kelimesi: D
Greg Martin

17

Oktav, 20 bayt

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

Çevrimiçi deneyin!

açıklama

Bu, fibonacci dizisinin f(n)şu şekilde yazılabileceği gerçeğini kullanır (bu bir matris vektörü gösterimi olmalıdır):

yinelemeli:

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

Açıkça:

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

Bu, bu matrisin gücüne en üstteki girişin aradığımız ndeğer olduğu anlamına gelir f(n). Açıkçası, tam da olduğu gibi bu matrisi tersine çevirebiliriz ve ilişki hala aynı nüks ilişkisini tanımlar. Bu aynı zamanda negatif girdiler için de işe yaradığı anlamına gelir.


1
(Bu) Negatif girdi için de işe yarar mı?
Roman Gräf

evet, açıklama geliyor ...
kusur

olan ans(-6)pozitif olması gerekiyordu?
FlipTack

@FlipTack Üzgünüz, dizin kayması nedeniyle olmuş olabilir. 1 tabanlı kullandım, soru ise 0 tabanlı kullandım, şimdi düzelttim.
kusur


11

Python, 43 bayt

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

Altın orana sahip doğrudan bir formül g. İle fyukarıdaki fonksiyonu:

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

Aynı uzunluk alt, sadece 5'in kareköküne takma:

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

Bununla rekabet edebilecek özyinelemeli bir işlev yapmanın bir yolunu görmedim. 57 bayt için hafif golf oyunu:

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

Karşılaştırma için, yinelemeli bir yöntem (Python 2'de 60 bayt):

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

Veya, 58 bayt için:

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

10

JavaScript (ES6), 42 bayt

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

Ölçek


Fonksiyonunu gerçekten beğendim. Burada bir önerim vardı, ama gözardı ettim - - bu yüzden işe
Luke

5

MATL , 11 9 bayt

Ben yaklaşık mutluyum [3,2]herkes bir yol biliyor () bana = bildirin lütfen, mutlaka golfed edilebilir ki, Bu da ayrıca birlikte çalışma [1,3].) -2 bayt = için teşekkürler @LuisMendo)

IHhBiY^2)

Bu, Octave ansewer ile aynı yaklaşımı kullanıyor . Fakat matrisi oluşturmak

[1,1]
[1,0]

sadece sayıyı 3ve ondalıktan ikiliye 2(yani 11ve 10) çeviririz .

Çevrimiçi deneyin!


5

JavaScript (ES7) 37 bayt

Binet'in Formülünü kullanır .

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

Bu, nth Fibonacci sayısını + - olarak verir 0.0000000000000005.


**ES7 gerektirir.
Neil

Oh, ES6'nın bir parçası olduğunu düşündüm, ama haklısın. Değiştirdi. Ayrıca Binet Formülünün bir başka versiyonunu 1B'lik bir kayıt için kullandım.
Luke,

Şimdi düşünüyorum da, sadece kullanmak 1-pyerine -1/paynı tasarruf için çalışmalıydım.
Neil

3

Jolf, 2 bayt

mL

Burada dene!

Fibonacci yerleşimi, phiformül kullanılarak uygulanır .


Yakalanmamış SyntaxError: Beklenmeyen belirteç | yeni İşlev'de (<anonymous>) p (math.min.js: 27) 'de Object (math.min.js: 27)' de yazılan (eval p (math.min.js: 27), <anonymous>: 36:14) Object.n [fabrika olarak] 'da (math.min.js: 45) t (math.min.js: 27)' de f (math.min.js: 27) 'de Object.get [median olarak ] (math.min.js: 27) klonda (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf adresinde. js: 2128 (En son Google Chrome, sürüm 55.0.2883.87m)
Ismael Miguel

@IsmaelMiguel Bu sadece firefox'ta çalışmalıdır
Conor O'Brien

Hiçbir fikrim yoktu, hiçbir yerde yok
Ismael Miguel

2

Haskell, 51 bayt

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

1
Bir bekçi içindeki birden testler ile kombine edilebilir ,yerine &&: even z,z<0.
nimi

1

PowerShell , 112 Bayt

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

Demo Çağrısı:

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

Demo Çıktısı:

-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 bayt

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

Bütün parantezlere bakıyorum .

Çevrimiçi deneyin!

Gerçekten çok küçük değil. Şu anda bir (get N)ya da (+ N)sadece basit bir kullanımını gerektiren bir ayrıştırma hatası var N. Küçük olanı seçtim. Ancak bunu golf oynamak için daha fazla yapılabilecek bir şey olduğunu sanmıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.