Определение
Последовательность Фибоначчи с переменной мощностью формируется следующим образом.
Начните с пустой последовательности и установите n в 1 .
Вычислите f n , n- е неотрицательное число Фибоначчи , с повторениями.
0 - первое, 1 - второе и третье, 2 - четвертое. Все остальные получаются суммированием двух предыдущих чисел в последовательности, поэтому 3 = 1 + 2 - это пятое, 5 = 2 + 3 - это шестое и т. Д.Если n нечетно, измените знак f n .
Добавьте 2 n-1 копии f n к последовательности.
Увеличьте n и вернитесь к шагу 2.
Это первые сто членов последовательности APF.
0 1 1 -1 -1 -1 -1 2 2 2 2 2 2 2 2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
задача
Напишите полную программу или функцию, которая принимает положительное целое число n в качестве входных данных и печатает или возвращает n- й член последовательности APF.
Если вы предпочитаете индексирование на основе 0, вы можете взять неотрицательное целое число n и напечатать или вернуть номер APF по индексу n .
Это код-гольф ; пусть победит самый короткий код в байтах!
Контрольные примеры (на основе 1)
1 -> 0
2 -> 1
3 -> 1
4 -> -1
7 -> -1
8 -> 2
100 -> -8
250 -> 13
500 -> -21
1000 -> 34
11111 -> 233
22222 -> -377
33333 -> 610
Контрольные примеры (на основе 0)
0 -> 0
1 -> 1
2 -> 1
3 -> -1
6 -> -1
7 -> 2
99 -> -8
249 -> 13
499 -> -21
999 -> 34
11110 -> 233
22221 -> -377
33332 -> 610
Ответы:
Желе , 5 байт
Попробуйте онлайн!
Как?
Расширяя ряд Фибоначчи обратно в отрицательные индексы, так что отношение
f(i) = f(i-2) + f(i-1)
остается в силе:Возвращаясь к
i=0
числам, мы должны повторить их 2 n-1 раз, и встроенная функция Фибоначчи ДжеллиÆḞ
вычислит их.Мы можем найти
-i
(положительное число), которое нам нужно, взяв длину в битахn
и вычтя1
.Так как мы хотим
i
(отрицательное число) , мы можем вместо выполнения1-bitLength
и желе имеет атом для1-x
,C
, комплемента монады.источник
µ
и⁸
Python 2 , 30 байт
Попробуйте онлайн!
Один индексированные.
Последовательность походила на головоломку, то, что Деннис создал, имея короткий способ выразить это. Степень двойного повторения предполагает повторение путем сдвига битов (деление на пол на 2).
f(n)=f(n-2)-f(n-1)
Рекурсию Фибоначчи с переменным знаком можно адаптировать к сдвигу битов вместо уменьшения. Базовый вариант работает хорошо, потому что все направлено наn=0
.источник
Mathematica,
433624 байтаБлагодаря @GregMartin сохранено 7 байт, а еще 12 - @JungHwanMin.
источник
Floor@Log2@#
, и написавFibonacci[t=...]
(и удалив пробелы в последнем показателе).Fibonacci@-Floor@Log2@#&
-Fibonacci
может принимать и отрицательные аргументы (заботится о знаке за вас).MATL ,
19171611 байтВход основан на 1.
Попробуйте онлайн! Или проверьте все тестовые случаи .
Как это работает
Для ввода n , основанного на 1 , пусть m будет количеством цифр в двоичном расширении n . П -й член в выходной последовательности является м -й член последовательности Фибоначчи, возможно , с его знак изменился.
Одной из идей было бы повторение m раз для вычисления членов последовательности Фибоначчи. Это легко сделать с помощью
for each
цикла, использующего массив двоичных цифр. Если бы последовательность Фибоначчи была инициализирована с 0 , а затем с 1, как обычно, итерация m раз привела бы к m + 2 слагаемым в стеке, поэтому два верхних числа пришлось бы удалить. Вместо этого мы инициализируем 1 , затем 0 . Таким образом, следующие сгенерированные термины - 1 , 1 , 2 , ... и требуется только одно удаление.Знак может быть обработан с помощью другого цикла, чтобы изменить знак m раз. Но это дорого. Лучше объединить два цикла, что делается простым вычитанием, а не добавлением в итерацию Фибоначчи.
источник
JavaScript (ES6), 33 байта
1-индексироваться.
Порт ответа xnor будет 23:
источник
Python 2 ,
838279 байтовПопробуйте онлайн!
источник
or -1
.Желе , 9 байт
Использует индексирование на основе одного.
Попробуйте онлайн!
объяснение
Этот метод работает, если ваша функция Фибоначчи поддерживает только неотрицательные аргументы.
источник
Japt , 6 байт
Проверьте это онлайн!
Как это работает
Как уже упоминалось в других ответах, то п - й член в знакопеременным ряда Фибоначчи является таким же , как -п - й член в очередной серии. n можно найти, взяв длину в битах и вычтя ее; отрицание этого приводит к 1 минус битовая длина.
источник
05AB1E ,
1110 байтИспользует индексирование на основе 1
05AB1E Функция Фибоначчи возвращает положительные числа Фибоначала меньше n , что означает, что нам нужно сгенерировать больше, чем необходимо, получить правильное число по индексу и затем вычислить знак. Поэтому я сомневаюсь, что любой метод, основанный на этом, будет короче, чем итерационный расчет чисел.
Использует осознание того, что мы можем инициализировать стек с помощью
1, 0
обращения, чтобы обрабатывать случай,n=1
как описано в ответе Луиса Мендо на MATL .Попробуйте онлайн!
объяснение
источник
Perl 6 , 53 байта
Прямая реализация последовательности, как она была описана.
Нулевой основе.
источник
Юлия 0,5 , 19 байт
Попробуйте онлайн!
Как это работает
При этом используется та же формула, что и в ответе Python @ xnor . Отношение рекуррентности
g (n) = g (n-2) + g (n-1) порождает отрицательные члены последовательности Фибоначчи, которые равняются положительным членам с чередующимися знаками. Из любого места в серии из 2 k повторений с одним и тем же номером мы можем выбрать любое повторение предыдущего набора из 2 k-1 чисел и набора из 2 k-2 чисел перед делением путем деления индекса на 2 и 4 .
Скорее, чем просто
мы можем переопределить оператор для наших целей. Кроме того, f будет работать так же хорошо с плавающей точкой, поэтому мы получаем
Наконец, если мы обновим n с делением на 4 , мы можем записать n / 2 как 2n и опустить пару символов, что приведет к 19-байтовому определению функции в этом ответе.
источник
J , 18 байт
Использует индексацию по одному. Принимает входное целое число n > 0 и вычисляет
floor(log2(n))
, находя длину его двоичного представления, а затем уменьшает это значение на единицу. Затем она находитfloor(log2(n))-1
й коэффициент порождающей функции х / (1 + х - x 2 ), который является gf для отрицательно-индексированных значений Фибоначчи.Попробуйте онлайн!
объяснение
источник