Чергування послідовності потужностей Фібоначчі


24

Визначення

Послідовність змінної сили Фібоначчі формується наступним чином.

  1. Почніть з порожньої послідовності і встановіть n в 1 .

  2. Обчисліть f n , n- е число негативного числа Фібоначчі з повторами.
    0 - це перше, 1 - друге, а третє, 2 - четверте. Усі інші отримуються шляхом підсумовування двох попередніх чисел у послідовності, тому 3 = 1 + 2 - п’яте, 5 = 2 + 3 - шосте тощо.

  3. Якщо n непарне, змініть знак f n .

  4. Додайте 2 n-1 примірників f n до послідовності.

  5. Збільшення 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

Чи є обмеження для n ?
Okx

2
Поки ваш алгоритм працює для довільно великих значень n , ви можете припустити, що він відповідає вашому типу даних.
Денніс

1
Чи має цей номер OEIS?
Міндвін

@Mindwin Це не так.
Денніс

Відповіді:


12

Желе , 5 байт

BLCÆḞ

Спробуйте в Інтернеті!

Як?

Розширення ряду Фібоначчі назад на негативні індекси таким чином, що відношення f(i) = f(i-2) + f(i-1)все-таки має місце:

  i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ...

Повертаючись з i=0числа, це те, що нам потрібно повторити 2 n-1 рази, і вбудована Філібонасса Джеллі ÆḞбуде обчислювати їх.

Ми можемо знайти -i(додатне число), яке нам потрібно, беручи розрядність nі віднімаючи 1.

Оскільки ми хочемо i(від’ємне число), ми можемо замість цього виконати, 1-bitLengthі у Jelly є атом для 1-x, Cмонада доповнення.

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21

Я знав, що існує коротший шлях, але не настільки багато, думав, що це буде 7 байт із способом видалення µі
миль

Твоє неодноразове заперечення було розумним, я дивився на сили мінус один, що додає пару байтів, поки я не згадав про негативні значення Фібоначчі і не спробував включити їх у монаду Джеллі.
Джонатан Аллан

4
Чесно кажучи, я здивований, у Джелі немає однобайтового вбудованого, щоб отримати двійкову довжину числа ...
ETHproductions

22

Python 2 , 30 байт

f=lambda n:n<1or f(n/4)-f(n/2)

Спробуйте в Інтернеті!

Одноіндексовані.

Послідовність відчувала себе головоломкою, щось, що Денніс створив, маючи короткий спосіб висловити це. Повторення потужності двох пропонують повторювати шляхом зміщення бітів (ділення підлоги на 2). Рекурсія Фібоначчі з змінним знаком f(n)=f(n-2)-f(n-1)може бути пристосована до переміщення в біт замість зменшення. Базовий корпус добре спрацьовує, тому що все виконує n=0.


6

Математика, 43 36 24 байти

Fibonacci@-Floor@Log2@#&

7 байтів збережено завдяки @GregMartin, а ще 12 завдяки @JungHwanMin.


1
Ви можете зберегти кілька байтів за допомогою Floor@Log2@#і в письмовій формі Fibonacci[t=...](і шляхом видалення пробілів в останньому експоненті).
Грег Мартін

1
-12 байт: Fibonacci@-Floor@Log2@#&- теж Fibonacciможе приймати негативні аргументи (піклується про знак для вас).
JungHwan Мін

5

MATL , 19 17 16 11 байт

lOiB"yy-]x&

Введення на основі 1.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Як це працює

Для 1 -го введення n , нехай m - кількість цифр у двійковому розширенні n . П -й член в вихідний послідовності є м -й член послідовності Фібоначчі, можливо , з його знак змінився.

Одна ідея полягала б у повторенні m разів для обчислення термінів послідовності Фібоначчі. Це легко за допомогою for eachциклу, використовуючи масив двійкових цифр. Якби послідовність Фібоначчі була ініціалізована з 0 , то 1, як зазвичай, повторення m разів призведе до складання m + 2 доданків на стеку, тому перші два числа повинні бути видалені. Замість цього ми ініціалізуємо з 1 , потім 0 . Таким чином, наступні згенеровані терміни становлять 1 , 1 , 2 , ... і потрібно лише одне видалення.

Зі знаком можна вирішити, використовуючи інший цикл для зміни знаку m разів. Але це дорого. Краще інтегрувати дві петлі, що робиться просто відніманням, а не додаванням в ітерації Фібоначчі.

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack



3

Желе , 9 байт

BLµ’ÆḞN⁸¡

Використовується одноосновна індексація.

Спробуйте в Інтернеті!

Пояснення

Цей метод працює, якщо ваша функція Фібоначчі підтримує лише негативні аргументи.

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1)

3

Japt , 6 байт

Mg1-¢l

Перевірте це в Інтернеті!

Як це працює

Як уже згадувалося в інших відповідях, то п - й член в знакозмінних ряду Фібоначчі є таким же , як -п - й член в черговій серії. n можна знайти, взявши бітну довжину вхідного і відніміть; заперечення цього призводить до 1 мінус бітової довжини.

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index.

3

05AB1E , 11 10 байт

Використовує індексацію на основі 1

Функція Фібоначчі 05AB1E повертає додатні числа волокон менше n , тобто ми повинні генерувати більше, ніж потрібно, отримати правильне за індексом, а потім обчислити знак. Тож я сумніваюся, що будь-який метод, заснований на цьому, буде коротшим, ніж ітераційний обчислення чисел.

Використовується усвідомлення того, що ми можемо ініціалізувати стек із 1, 0зворотним керуванням для справи, n=1як описано у відповіді Луїза Мендо MATL .

XÎbgG‚D«`-

Спробуйте в Інтернеті!

Пояснення

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements

2

Perl 6 , 53 байти

{flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]}

Безпосередня реалізація послідовності, спосіб її опису.
Нульова основа.


2

Джулія 0,5 , 19 байт

!n=n<1||!(n/=4)-!2n

Спробуйте в Інтернеті!

Як це працює

Для цього використовується така ж формула, що і відповідь Python @ xnor . Відношення рецидиву
g (n) = g (n-2) + g (n-1) породжує від'ємні умови послідовності Фібоначчі, які дорівнюють позитивним членам з чергуючими знаками. Ми можемо вибрати будь-яке повторення попереднього пробігу 2 к-1 чисел та пробіг 2 к-2 чисел перед тим, поділивши індекс на 2 та 4, з будь-якого місця в пробігу 2 к повторень одного і того ж числа .

Замість прямого

f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes

ми можемо переосмислити оператора для наших цілей. Крім того, f буде працювати так само добре з поплавцями, тому ми отримуємо

!n=n<1||!(n/4)-!(n/2)   # 21 bytes

Нарешті, якщо ми оновлюємо n діленням на 4 , wwe може записати n / 2 як 2n і опустити пару парен, що веде до 19-байтового визначення функції у цій відповіді.


1

J , 18 байт

(%>:-*:)t.@<:@#@#:

Використовується одноосновна індексація. Бере ціле число введення n > 0 і обчислює floor(log2(n)), знаходячи довжину його двійкового подання, а потім зменшує значення на одиницю. Потім він знаходить коефіцієнт floor(log2(n))-1th, що формує функцію x / (1 + x - x 2 ), який є gf для негативно індексованих значень Фібоначчі.

Спробуйте в Інтернеті!

Пояснення

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.