Желе , 5 байт
_Ḟ1+¡
Это итеративное решение без встроенных модулей. Он использует ту же индексацию, что и спецификация задачи.
Попробуйте онлайн!
Фон
Пусть f - функция, определенная в спецификации вызова, а F - функция Фибоначчи, определенная как обычно (т. Е. С F (0) = 0 ). Для неотрицательного целого числа n имеем f (n) = F (n + 1) . Когда 0 ≤ x <1 , спецификация вызова определяет f (n + x) как f (n) + (f (n + 1) - f (n)) x .
Очевидно, что это влияет только базовые случаи, но не рекурсивная формула, то есть F (п) = е (п - 1) + F (п - 2) имеет место , как это было бы для F . Это означает, что мы можем упростить определение для нецелочисленных аргументов до более простого f (n) = f (n) + f (n - 1) x .
Как отметили другие в своих ответах, рекурсивные отношения также справедливы для нецелых аргументов. Это легко проверить, так как
Поскольку f (0) = f (1) = 1 , f постоянна в интервале [0, 1] и f (0 + x) = 1 для всех x . Кроме того, f (-1) = F (0) = 0 , поэтому f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Эти базовые случаи охватывают [-1, 1) , поэтому вместе с рекурсивной формулой они завершают определение f .
Как это устроено
Как и раньше, пусть n + x будет единственным аргументом нашей монадической программы.
¡
это быстро , а это означает , что он потребляет несколько ссылок на его левый и превращает их в QuickLink . ¡
в частности потребляет одну или две ссылки.
<F:monad|dyad><N:any>
вызывает ссылку N , возвращая r , и выполняет F всего r раз.
<nilad|missing><F:monad|dyad>
устанавливает r в качестве последнего аргумента командной строки (или ввода из STDIN при их отсутствии) и выполняет F всего r раз.
Поскольку 1
это nilad (ссылка без аргументов), применяется второй случай, и он +¡
будет выполнен +
n раз (нецелочисленный аргумент округляется в меньшую сторону). После каждого вызова +
левый аргумент быстрой ссылки заменяется возвращаемым значением, а правый аргумент - предыдущим значением левого аргумента.
Что касается всей программы, Ḟ
этажи вводятся, давая n ; затем _
вычтите результат из ввода, получив ** x, который становится возвращаемым значением.
1+¡
затем вызывает +¡
- как описано выше - с левым аргументом 1 = f (0 + x) и правым аргументом x = f (-1 + x) , который вычисляет желаемый результат.