Twoim zadaniem jest znalezienie n- tej liczby Fibonacciego, ale n niekoniecznie jest liczbą całkowitą.
Sekwencja Fibonacciego, indeksowana 0, wygląda następująco:
0, 1, 2, 3, 4, 5, 6, 7, ...
1, 1, 2, 3, 5, 8, 13, 21, ...
Co się jednak stanie, jeśli chcemy 2, 4- tą liczbę?
2,4 p liczba jest 0,4 razy większa różnica między 3 rd i 2 nd Fibonacciego plus 2 ND liczby Fibonacciego. Tak więc 2,4- ta liczba Fibonacciego to 2 + 0.4 * (3 – 2) = 2.4
.
Podobnie 6,35 th liczba Fibonacciego jest 13 + 0.35 * (21 – 13) = 15.8
.
Twoim zadaniem jest znalezienie n- tej liczby Fibonacciego, aby n było większe lub równe 0.
Możesz zrobić to zero lub z jednym indeksowaniem, po prostu powiedz, którego używasz.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
Kilka innych przykładów:
0 1
4.5 6.5
0.7 1
7 21
F_0 = 0
iF_2 = 1
powinniśmy miećF_1 = (1/2)(F_0 + F_2) = 1/2
.Odpowiedzi:
Galaretka , 5 bajtów
Jest to iteracyjne rozwiązanie bez wbudowanych elementów. Używa tego samego indeksowania co specyfikacja wyzwania.
Wypróbuj online!
tło
Niech f będzie funkcją zdefiniowaną w specyfikacji wyzwania, a F funkcją Fibonacciego zdefiniowaną jak zwykle (tj. Z F (0) = 0 ). Dla nieujemnej liczby całkowitej n mamy f (n) = F (n + 1) . Gdy 0 ≤ x <1 , specyfikacja wyzwania definiuje f (n + x) jako f (n) + (f (n + 1) - f (n)) x .
Oczywiście, dotyczy to tylko przypadki bazowe, ale nie rekurencyjne o wzorze, to znaczy M (n) = r (n - 1) + F (n - 2) posiada, jak to będzie w F . Oznacza to, że możemy uprościć definicję argumentów niecałkowitych do łatwiejszego f (n) = f (n) + f (n - 1) x .
Jak zauważyli inni w swoich odpowiedziach, relacja rekurencyjna dotyczy również argumentów niecałkowitych. Jest to łatwe do zweryfikowania, jak
Od Rf (0) = f (1) = 1 , M w stałych w przedziale [0, 1], i f (0 + x) = 1 dla wszystkich x . Ponadto, f (-1) = F (0) = 0 , więc f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Te przypadki podstawowe obejmują [-1, 1) , więc wraz ze wzorem rekurencyjnym uzupełniają definicję f .
Jak to działa
Tak jak poprzednio, niech n + x będzie jedynym argumentem naszego programu monadycznego.
¡
jest szybki , co oznacza, że zużywa niektóre linki po lewej stronie i zamienia je w szybkie łącze .¡
w szczególności zużywa jedno lub dwa łącza.<F:monad|dyad><N:any>
wywołuje łącze N , zwracając r , i wykonuje F łącznie r razy.<nilad|missing><F:monad|dyad>
ustawia r na ostatni argument wiersza poleceń (lub dane wejściowe z STDIN w przypadku ich braku) i wykonuje F łącznie r razy.Ponieważ
1
jest to nilad (link bez argumentów), obowiązuje drugi przypadek i+¡
zostanie wykonany+
n razy (argument nie będący liczbą całkowitą jest zaokrąglany w dół). Po każdym wywołaniu do+
lewy argument szybkiego łącza jest zastępowany wartością zwracaną, a prawy poprzednią wartością lewego argumentu.Jeśli chodzi o cały program,
Ḟ
wprowadza dane wejściowe na podłogę, dając n ; następnie_
odejmij wynik od danych wejściowych, uzyskując ** x, który staje się wartością zwracaną.1+¡
następnie wywołuje+¡
- jak opisano wcześniej - z lewym argumentem 1 = f (0 + x) i prawym argumentem x = f (-1 + x) , co oblicza pożądany wynik.źródło
+¡
są wyzwania Fibonacciego. Czy celowe było mieć¡
pracę jak fibonacci z diadami?%1+¡
: interpolacja liniowa między n × F (n) przy n oraz n × F (n-1) + F (n) przy n-ε , i zwiększenie między n-ε i n .%1+¡
ma robić?Mathematica, 32 bajty
Czysta funkcja przyjmująca nieujemną liczbę rzeczywistą jako dane wejściowe i zwracająca liczbę rzeczywistą. Gdyby
1~Max~#
zostały zastąpione przez1
, byłaby to standardowa rekurencyjna definicja liczb Fibonacciego o indeksie 0 dla argumentów liczb całkowitych. Ale1~Max~#
jest to poprawna cząstkowa funkcja liniowa dla rzeczywistych danych wejściowych od 0 do 2, a rekurencja zajmuje się resztą. (Ciekawostki: zmiana tego na 1-indeksowane liczby Fibonacciego można osiągnąć po prostu poprzez zmianę naMax
aMin
!)Najkrótszy, jaki mogłem uzyskać dzięki wbudowanemu, to 37-bajtowy
(b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&
.źródło
Python 2 , 42 bajty
Wypróbuj online!
źródło
JavaScript (ES6), 30 bajtów
Trywialna modyfikacja rekurencyjnej definicji sekwencji Fibonacciego o indeksie zerowym. Może powodować niewielkie błędy zaokrąglania dla niektórych danych wejściowych.
źródło
Galaretka ,
1712 bajtówWypróbuj online!
Niezintegrowane rozwiązanie.
Wyjaśnienie
Funkcja pomocnika
1Ŀ
Główny program
Dane wejściowe z zakresu od 0 do 1 będą zatem nasycone - odejmą do zera, dlatego dodajemy 1, aby otrzymać F (0) = F (1) = 1. Dane wejściowe z zakresu od 1 do 2 powrócą. Te podstawowe przypadki są wystarczające, aby wykonać typową rekurencję Fibonacciego i obliczyć z niej inne wartości.
źródło
Excel,
137 124 119 113 10297 bajtówPodejście nierekurencyjne / iteracyjne. (Bezpośrednio obliczyć n-ty termin). Wykorzystuje metodę z jednym indeksowaniem . Dodanie
+1
do=TRUNC(B1)
zmienia go do zindeksowanego zera.Fragment kodu jest przeznaczony do umieszczenia w komórce A1 .
Komórka wejściowa to B1 . Komórka wyjściowa to A1 .
źródło
JavaScript (ES6),
6764 bajtówMa kilka problemów z zaokrąglaniem
Spróbuj
źródło
PHP, 90 bajtów
Wersja online
źródło
Galaretka ,
139 bajtówUżywa tego samego indeksowania co specyfikacja wyzwania.
Wypróbuj online!
tło
Zgodnie ze specyfikacją mamy F (n + x) = F (n) + (F (n + 1) - F (n)) x , dla naturalnego n i 0 ≤ x <1 . Ponieważ F (n + 1) = F (n) + F (n - 1) , można to przepisać jako F (n + x) = F (n) + F (n - 1) x .
Ponadto indeksowanie zastosowane w specyfikacji wyzwania definiuje funkcję f (n) = F (n + 1) (gdzie F jest zwykłą funkcją Fibonacciego, tj. F (0) = 0 ), więc otrzymujemy wzór f (n + x) = F (n + 1) + F (n) x .
Jak to działa
źródło
Perl 6 ,
4838 bajtów48
Spróbuj
38
Spróbuj
Rozszerzony:
48
(
$0
i$1
jest skrótem od$/[0]
i$/[1]
)38
To był inspirowany przez inne Python i Javascript rozwiązania
źródło
Julia 0.5 , 31 bajtów
Jest to po prostu przetłumaczona odpowiedź Rod.
Wypróbuj online!
źródło