_Ḟ1+¡
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.