Ваша задача - найти n- е число Фибоначчи, но n не обязательно является целым числом.
Последовательность Фибоначчи с 0 индексами выглядит следующим образом:
0, 1, 2, 3, 4, 5, 6, 7, ...
1, 1, 2, 3, 5, 8, 13, 21, ...
Однако что произойдет, если мы хотим 2,4- го числа?
2,4- е число в 0,4 раза больше разницы между 3- м и 2- м числами Фибоначчи плюс 2- е число Фибоначчи. Итак, 2,4- е число Фибоначчи есть 2 + 0.4 * (3 – 2) = 2.4
.
Аналогично, 6,35- е число Фибоначчи есть 13 + 0.35 * (21 – 13) = 15.8
.
Ваша задача - найти n- е число Фибоначчи, такое, что n больше или равно 0.
Вы можете сделать это с нулями или с одним индексом, просто скажите, какой из них вы используете.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Еще несколько примеров:
0 1
4.5 6.5
0.7 1
7 21
F_0 = 0
иF_2 = 1
мы должны иметьF_1 = (1/2)(F_0 + F_2) = 1/2
.Ответы:
Желе , 5 байт
Это итеративное решение без встроенных модулей. Он использует ту же индексацию, что и спецификация задачи.
Попробуйте онлайн!
Фон
Пусть 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) , который вычисляет желаемый результат.источник
+¡
для вызовов Фибоначчи. Было ли целесообразно¡
работать с диадами, как Фибоначчи?%1+¡
: линейная интерполяция между n × F (n) в n и n × F (n-1) + F (n) в n-ε , и шаг между n-ε и n .%1+¡
должен делать?Mathematica, 32 байта
Чистая функция, принимающая неотрицательное действительное число в качестве входных данных и возвращающая действительное число. Если
1~Max~#
их заменить на1
, это будет стандартное рекурсивное определение 0-индексированных чисел Фибоначчи для целочисленных аргументов. Но1~Max~#
это правильная кусочно-линейная функция для реальных входов от 0 до 2, и рекурсия позаботится обо всем остальном. (Пустяки факт: изменение этого к 1-индексированных чисел Фибоначчи может быть достигнуто лишь путем измененияMax
кMin
!)Самое короткое, что я мог получить со встроенным, это 37-байтовый код
(b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&
.источник
Python 2 , 42 байта
Попробуйте онлайн!
источник
JavaScript (ES6), 30 байт
Тривиальная модификация рекурсивного определения последовательности Фибоначчи с нулевым индексом. Может давать небольшие ошибки округления для некоторых входных данных.
источник
Желе ,
1712 байтПопробуйте онлайн!
Не встроенное решение.
объяснение
Вспомогательная функция
1Ŀ
Основная программа
Следовательно, вход в диапазоне от 0 до 1 будет насыщенно-вычитаться до 0, поэтому мы добавляем 1, чтобы получить F (0) = F (1) = 1. Вход в диапазоне от 1 до 2 вернется сам. Эти базовые случаи достаточны для выполнения типичной рекурсии Фибоначчи и вычисления других значений оттуда.
источник
Excel,
137 124 119 113 10297 байтНерекурсивный / итеративный подход. (Непосредственно вычислите n-е члены). При этом используется одноиндексный метод. Добавление
+1
к=TRUNC(B1)
изменениям это с нулевой индексацией.Фрагмент кода предназначен для размещения, начиная с ячейки A1 .
Ячейка ввода - B1 . Выходная ячейка - А1 .
источник
JavaScript (ES6),
6764 байтаИмеет несколько проблем с округлением
Попытайся
источник
PHP, 90 байт
Онлайн версия
источник
Желе ,
139 байтПри этом используется та же индексация, что и в спецификации задачи.
Попробуйте онлайн!
Фон
Согласно спецификации, мы имеем F (n + x) = F (n) + (F (n + 1) - F (n)) x , для натурального n и 0 ≤ x <1 . Поскольку F (n + 1) = F (n) + F (n - 1) , это можно переписать как F (n + x) = F (n) + F (n - 1) x .
Кроме того, индексирование, используемое в спецификации вызова, определяет функцию f (n) = F (n + 1) (где F - обычная функция Фибоначчи, т. Е. F (0) = 0 ), поэтому мы получаем формулу f (n + x) = F (n + 1) + F (n) x .
Как это устроено
источник
Perl 6 ,
4838 байт48
Попытайся
38
Попытайся
Expanded:
48
(
$0
и$1
сокращение от$/[0]
и$/[1]
)38
Это было вдохновлено другими решениями Python и Javascript
источник
Юлия 0,5 , 31 байт
В основном это просто перевод Рода.
Попробуйте онлайн!
источник