Istnieje dobrze znane pytanie , które wymaga krótkiego (najmniej znaków) generatora sekwencji fibonacciego.
Chciałbym wiedzieć, czy ktoś może wygenerować tylko pierwsze N elementów sekwencji Fibonacciego w bardzo małej przestrzeni. Próbuję to zrobić w Pythonie, ale interesuje mnie krótka odpowiedź w dowolnym języku. Funkcja F (N) generuje pierwsze N elementów sekwencji, albo zwraca je jako zwrot funkcji, albo drukuje.
Co ciekawe wydaje się, że odpowiedzi na kod-golf zaczynają się 1 1 2
od 0 1 1 2
. Czy jest to konwencja w golfa kodowym lub ogólnie w programowaniu? (Wikipedia mówi, że sekwencja Fibonacciego zaczyna się od zera).
Przykład Python (pierwsze 5 elementów):
def f(i,j,n):
if n>0:
print i;
f(j,i+j,n-1)
f(1,1,5)
F_0 = 0, F_1 = 1
lub równorzędneF_1 = 1, F_2 = 1
. Różnica polega na tym, czy chcesz rozpocząć sekwencję od indeksu 0 (częściej w programowaniu) czy 1 (częściej w matematyce).F_0 = 0, F_1 = 1
ma określoną zaletę w prostocie dzięki reprezentacji macierzy[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Odpowiedzi:
do
Nie przejmowałem się liczeniem, ale oto zabawny przykład:
Dowód to działa.
Jestem z tego dość dumny: nudziłem się, więc przestawiłem swój kod (z kilkoma małymi dodatkami), aby każdy wiersz reprezentował wartość w sekwencji Fibonacciego.
Dowód to działa.
źródło
a++<=b
->a++-b
ireturn--n<3?1:f(n)+f(n-1)
. Plus możesz tego uniknąć,scanf
jeśli potrzebujesz nargc
.--n
tego samego wyrażenia jest nieistotne. Znakomity!4
powinna być3
. Jak obecnie napisano z<4
, wyprodukowana sekwencja to 1, 1, 1, 2, 3, 5, 8 ... To o jeden za dużo jeden.return n<3?n>0:f(--n)+f(--n);
Haskell (26)
Zaskakujące jest to tylko jedno postać dłuższa niż rozwiązanie J.
Ogoliłem kilka postaci:
take
jako operator binarny;scanl
zamiast gadatliwegozipWith
.źródło
s
jest tak elegancki, że nie wiem, jak ktokolwiek pomyślałby o takim rozwiązaniu! Nie wiedziałem, że możesz użyćs
ponownie podczas definiowanias
. (Nadal jestem początkującym =)Oto jedno-liniowy Python. Wykorzystuje zmiennoprzecinkowe, więc mogą istnieć takie,
n
dla których nie jest już dokładny.F(n)
zwraca ciąg zawierający pierwszen
liczby Fibonacciego oddzielone spacjami.źródło
GolfScript, 16 znaków
Przykładowe dane wyjściowe:
źródło
Perl, 50 znaków
źródło
Scala 71:
odciski
źródło
Perl,
2928 bajtówWyjaśnienie
Jest to oparte na klasycznej
$b += $a = $b-$a
rekurencji, która działa w następujący sposób:$a
zawieraF(n-2)
i$b
zawieraF(n)
$a = $b-$a
$a
zawieraF(n-1)
$b += $a
$b
zawieraF(n+1)
Problemem jest tutaj inicjalizacja. Klasyczny sposób jest,
$b += $a = $b-$a || 1
ale potem sekwencja idzie1 2 3 5 ...
Rozszerzając sekwencję fibonacciego w lewo:
widzisz, że właściwym punktem wyjścia jest
$a = -1
i$b = 0
. Inicjalizację $ a można połączyć z konfiguracją pętliNa koniec zastąp
$a
przez,$;
aby pozbyć się miejsca przedfor
źródło
Mogę podać dwuliniowe rozwiązanie Python. To zwróci je jako listę.
Możesz je wydrukować, dodając kolejną mapę, aby utworzyć ciągi, a następnie dodając złączenie, ale to po prostu wydaje mi się niepotrzebne.
Niestety nie wiem, jak włożyć rekurencyjną lambdę
map
, więc utknąłem na dwóch liniach.źródło
g(100)
? ;)f(n)
zen<=0
zwracanymi liczbami całkowitymi in>0
listamif = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
0
w swojej odpowiedzi. Zmianaf
na powrótn if n < 2
to jedno obejście. :)Python (78 znaków)
Użyłem wzoru Bineta do obliczenia liczb Fibonacciego -
Niektóre inne odpowiedzi tutaj nie są tak małe, ale chłopcze, jest szybki
źródło
print"11235"
:)2**i
.**
mają wyższy priorytet niż*
Schemat
Jest to zoptymalizowane za pomocą rekurencji ogona:
źródło
Haskell
Dowód, że to działa .
źródło
J, 25 znaków
Zdaję sobie sprawę, że rozwiązania J prawdopodobnie nie są tym, czego szukasz, ale oto jedno z nich. :-)
Stosowanie:
Jak to działa:
Zaczynając od prawej (ponieważ programy J są odczytywane od prawej do lewej),
2-~ 6
~
Operatora odwraca argument czasownika więc jest taka sama, jak6-2
Ignorując na razie sekcję w nawiasach,
0 1(...)@[&0~ x
bierze czasownik w nawiasach i wykonuje gox
razy, używając listy0 1
jako danych wejściowych -~
ponownie odwraca tutaj argumenty, dającx (...)@[&0 ] 0 1
, co oznacza, że mogę zachować dane wejściowe na końcu funkcji.W nawiasie jest widelec
],+/&(_2&{.)
, który składa się z trzech czasowników -]
,,
i+/&(_2&{.)
.Rozwidlenie przyjmuje trzy czasowniki
a b c
i używa ich w następujący sposób:(x a y) b (x c y)
gdziex
iy
są argumentami rozwidlenia. Jest,
to czasownik środkowy w tym widelcu i łączy wynikix ] y
ix +/&(_2&{.) y
razem.]
zwraca niezmieniony lewy argument, więcx ] y
ocenia nax
.+/&(_2&{.)
pobiera dwa ostatnie elementy z podanej listy(_2&{.)
- w tym przypadku0 1
- a następnie dodaje je do siebie+/
(po&
prostu działają jak klej).Gdy czasownik zadziała, a wynik zostanie przekazany do następnego uruchomienia, generując sekwencję.
źródło
TI-Basic, 43 znaki
Kod ten można bezpośrednio wstawić do programu głównego lub przekształcić w osobny program, do którego odwołuje się pierwszy.
źródło
APL (33)
Stosowanie:
źródło
Python (55)
źródło
PowerShell - 35 znaków
Program PowerShell akceptuje wprowadzanie potokowe , więc jestem przekonany, że
n |
inn | <mycode>
nie powinno być sprzeczne z moimi obliczeniami, ale jest tylko częścią inicjowania „funkcji” w języku.Pierwsze rozwiązanie zakłada, że zaczynamy od 0:
Drugie rozwiązanie zakłada, że możemy zacząć od 1:
Przykładowe wywołanie:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Wydajność:
Co ciekawe, próby uniknięcia napowietrznej na
for()
pętli spowodowały w tym samym liczba znaków:%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.źródło
Python, 43 znaki
Oto trzy zasadniczo różne jedno-linijki, które nie używają formuły Bineta.
Nigdy
reduce
tak bardzo nie wykorzystywałem .źródło
reduce
nadużyciedc, 32 znaki:
To faktycznie zawsze pokazuje dwa pierwsze 1, więc funkcja działa tylko zgodnie z oczekiwaniami dla N> = 2 .
C, 75 znaków:
Nie tak fajna, jak zaakceptowana odpowiedź, ale krótsza i znacznie szybsza:
Dodatkowy:CL, 64 znaki:
Jedna z moich najczęściej używanych zakładek w tym semestrze ma interesujący przykład, który jest krótszy niż
wieleinnych tutaj, i jest to tylko proste wywołanieloop
makra - w zasadzie tylko jedno zdanie! Usuwałem go z całej białej przestrzeni, jaką mogłem:Dość krótki, miły i czytelny! Aby odczytać dane wejściowe
n
(w tym otaczające białe spacje) można zastąpić(read)
, dodając 3 znaki.źródło
main
bierze cztery argumenty?FAŁSZ, 28 bajtów
źródło
1_
zamiast0 1 -
Python 2, 38 bajtów
Ulepszenie wcześniej opublikowanego rozwiązania:
Używa
exec
i mnożenia ciągów, aby uniknąć pętli.Python 3, 46 bajtów
Nie tak wydajne w Pythonie 3:
źródło
C99, 58 znaków
Poniższa funkcja wypełnia tablicę liczb całkowitych pierwszymi
n
wartościami z sekwencji Fibonacciego zaczynającymi się od 0.Test uprzęży, przyjmując
n
jako argument wiersza poleceń:źródło
CoffeeScript, 48
65 w js:
źródło
PHP, 87
Używa
array_sum
funkcji rekurencyjnej do generowania serii.Na przykład:
źródło
F #, 123
źródło
Scala, 65 znaków
Wyświetla na przykład pierwsze 9 liczb Fibonacciego. Aby wersja była bardziej użyteczna, biorąc sekwencję z danych wejściowych konsoli, wymagane jest 70 znaków:
Uwaga: użycie zakresu ogranicza to do wartości Int.
źródło
Pytanie 24
Pierwsze n liczb Fibonacciego
źródło
Lua, 85 bajtów
Uczę się Lua, więc chciałbym dodać ten język do puli.
a całość zajęła 85 znaków, a parametr jako argument wiersza poleceń. Kolejną zaletą jest to, że jest łatwy do odczytania.
źródło
FAŁSZ, 20 znaków
Dane wejściowe powinny znajdować się na stosie przed uruchomieniem tego.
źródło
Pyt , 3 bajty
Wypróbuj online!
źródło
kod maszynowy x86 - 379 bajtów
Wersja z nagłówkami ELF o rozmiarze 484 bajtów:
Wersja bez nagłówka (do oceny):
Oblicza (ewentualnie)∞ liczby Fibonacciego.
źródło