Желе , 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 є єдиним аргументом нашої монадичної програми.
¡
це швидкий , що означає, що він споживає деякі посилання зліва і перетворює їх у швидке посилання . ¡
зокрема споживає одну або дві ланки.
<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) , який обчислює бажаний вихід.