Фон
Почти все знакомы с числами Фибоначчи F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Они образованы функцией рекурсии F(n) = F(n-1) + F(n-2)
с F(0)=0
и F(1)=1
. A000045
Тесно связанной последовательностью являются числа Лукаса L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Они образованы функцией рекурсии L(m) = L(m-1) + L(m-2)
с L(0)=2
и L(1)=1
. A000032
Мы можем чередовать две последовательности, основываясь на четных / нечетных индексах, с конструкцией,
A(x) = F(x)
если x mod 2 = 0
и A(x) = L(x)
иначе. Например, A(4)
равно F(4)
с 4 mod 2 = 0
. Мы будем называть эту последовательность в Lucas-nacci Числа , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Это может быть сформировано с помощью функции рекурсии A(x) = 3*A(x-2) - A(x-4)
с A(0)=0
, A(1)=1
, A(2)=1
и A(3)=4
. A005013
Вызов
При заданном вводе n
выведите последовательность n+1
чисел до и включительно, A(n)
как описано выше. Побеждают самые короткие байты (или байтовые эквиваленты, такие как для LabVIEW , которые определяются индивидуально на Meta).
вход
Одно неотрицательное целое число n
.
Выход
Список чисел, которые соответствуют подпоследовательности чисел Lucas-nacci от A(0)
до A(n)
. Список должен быть в последовательном порядке, как описано выше.
правила
- Применяются стандартные правила игры в гольф и ограничения на лазейки .
- Применяются стандартные правила ввода / вывода .
- Входной номер может быть в любом подходящем формате: унарный или десятичный, считанный из STDIN, аргумент функции или командной строки и т. Д. - на ваш выбор.
- Вывод может быть распечатан в STDOUT или возвращен в результате вызова функции. Если напечатано, должны быть включены подходящие разделители для различения чисел (через пробел, через запятую и т. Д.).
- Кроме того, если вывод в STDOUT, окружающий пробел, завершающий перевод строки и т. Д. Являются необязательными.
- Если входные данные не целые или отрицательные, программа может делать что угодно или ничего, так как поведение не определено.
Примеры
Input -> Output
0 -> 0
5 -> 0, 1, 1, 4, 3, 11
18 -> 0, 1, 1, 4, 3, 11, 8, 29, 21, 76, 55, 199, 144, 521, 377, 1364, 987, 3571, 2584
Ответы:
Желе, 12 байт
Попробуйте онлайн!
Фон
Мы можем расширить F и L до -1, определив F (-1) = 1 и L (-1) = -1. Это согласуется с рекурсивной функцией.
Наша программа начинается с
На каждом шаге, чтобы сформировать следующую пару, мы обращаем последнюю пару и добавляем ее в предпоследнюю пару. Например:
Если мы продолжим этот процесс еще на несколько шагов, мы получим
Последовательность Лукаса-Наччи - просто левый столбец.
Как это устроено
‡
С
заглядывает на две ссылки слева:2
иU+¥
. Так как самый левый из них - нилада, он не может быть телом цикла. Следовательно,U+¥
используется как тело, а число читается из ввода. Поскольку аргументов командной строки нет, это число считывается из STDIN.источник
CJam,
2120 байтСпасибо Sp3000 за сохранение 1 байта.
Проверьте это здесь.
объяснение
Просто использует повторение, указанное в спецификации вызова.
источник
Perl 6, 42 байта
использование
источник
{( (0,1,*+*...*) Z (2,1,*+*...*) ).flat.rotor( 1=>2, 1=>0 )[ 0..$_ ].flat}
(0,1,1,4,{$^b;$^d;3*$^c-$^a}...*)[^(n+1)]
.Haskell,
59,57,56,52, 51 байтОпределение серии адаптировано из этого ответа .
Менее гольф:
fibLike start
дает бесконечный список, определяется:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
возвращает 2 для нечетного ввода (ряд Лукаса) или 0 для четного (ряд Фибоначчи).lucasNacci i
дает i-е число Лукаса-Наччи.firstN n
карты над списком.Один байт сохранен Бумерангом.
источник
2*mod i 2
вl
то вы можете удалить скобки.l a=2*mod a 2:scanl(+)1(l a)
f n=[l i!!i|i<-[0..n]]
ES6, 65 байт
Использует рекуррентное соотношение, приведенное в вопросе.
источник
Сетчатка ,
706259 байтПопробуйте онлайн
1?
$`¶
- Создайте строку для каждого числа от 0 до n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
- Добавитьff
в нечетные строки. Это запустит функцию с L (0) = 2.m`$
f
- Добавитьf
ко всем строкам (обратите внимание на пробел). Это заполняет функцию 0 и 1 для чисел Фибоначчи и 2 и 1 для чисел Лукаса.+`1(f*) (f*)
$2 $2$1
- Цикл: вычислить F (n + 1) = F (n) + F (n-1), пока еще есть 1 с.f*
- Удалить F (n + 1) с конца каждой строки.
f
s обратно на 1 с. Если это не нужно, и мы можем остаться сf
s, длина составляет всего 55 байтов.источник
Oracle SQL 11.2,
218216201 байтUn-golfed
Мне удалось получить несколько байтов, используя (злоупотребляя?) Функцию SIGN, чтобы сгенерировать первые 3 элемента последовательности.
источник
Japt,
252221 байтПроверьте это онлайн!
Фон
Сложно создать последовательность Фибоначчи в Japt, но у нас есть встроенная
Mg
возможность сделать это за нас. Однако это дает нам только последовательность Фибоначчи, а не последовательность Лукаса. Мы можем выполнить последовательность Lucas довольно легко, используя этот трюк:Как видите,
F(N-1) + F(N+1)
равенL(N)
всемN
. Однако, поскольку нам нужны только числа Лукаса для нечетных индексов, мы можем объединить две формулы в одну:Как это устроено
источник
Mathematica,
5251 байтИдея, очень похожая на рассмотренную Мартином выше, я потратил некоторое время, пытаясь найти более короткий способ определения «базовых вариантов» для функции. Полиномиальная интерполяция была неудачей, поэтому я пошел на это, используя расширение в негативы, чтобы получить довольно короткое определение.
источник
Mathematica, 56 байт
Очень простая реализация. Определяет вспомогательную функцию
f
и затем оценивает безымянную функцию, которая применяетсяf
к диапазону, чтобы получить все результаты. Это чувствует себя излишне громоздким.Кажется, что одна безымянная функция длиннее на один байт:
источник
MATL , 17
18байтПочти прямой перевод ответа Мартина CJam .
Попробуйте онлайн!
источник
Брахилог , 51 байт
Он принимает число в качестве ввода и печатает для вывода списка, с пробелами, разделяющими каждое число.
объяснение
Вырезание
!
в первом правиле предиката 1 необходимо, чтобы, когда мы возвращаемся назад (\
), мы не оказывались в бесконечном цикле, где интерпретатор будет пробовать второе правило для ввода, меньшего 4.источник
Mathematica, 41 байт
источник
Groovy, 50 байт
Это определяет функцию x, которая принимает n в качестве первого аргумента и имеет базовый регистр первых четырех чисел в последовательности Fibocas в качестве аргументов по умолчанию для остальной части функции.
а вот п. b, c, d и e - следующие четыре элемента в последовательности.
Он уменьшает n и повторяется до тех пор, пока n не станет меньше нуля - когда он повторяется, он добавляет к окончательному возвращаемому значению первый элемент в своей текущей последовательности. Новые значения для следующих четырех элементов в последовательности передаются рекурсивному вызову - последние три элемента сдвигаются, чтобы быть первыми тремя, и новый четвертый элемент генерируется из двух из предыдущих элементов с использованием 3 * дБ.
Он разграничивает новые значения с помощью вложенности списка, так как groovy может возвращать несколько значений, помещая их в список, поэтому каждый вызов возвращает текущий первый элемент и результат рекурсии, который будет его собственным списком.
источник
R , 55 байт
Попробуйте онлайн!
источник
Пилоны , 19
Это довольно прямой перевод подхода Мартина.
Как это устроено:
источник
DUP , 32 байта
Try it here!
Анонимная лямбда, которая оставляет последовательность чисел в стеке. Использование:
объяснение
источник
Python 2, 71 байт
Это определенно кажется слишком длинным. Однако я был рад, что мне удалось использовать побитовый
not
оператор ... дважды. Один раз как вид паритета переворачивай взад-вперед и один раз заканчивай рекурсию, когдаn
достигнет-1
.Переменная
p
всегда будет либо0
либо-1
, либо , поэтому она будет чередоваться между записями0
или-1
списком. (Выбор записи-1
в списке Python означает выбор последнего элемента.)источник
Мета-программирование шаблона C ++, 130 байт
Рекурсивные определения почему-то требуют C ++ TMP, использование:
с
x
тем, чтоA(x)
вам нравится.источник