Функція або послідовність Фібоначчі


115

Послідовність Фібоначчі - це послідовність чисел, де кожне число у послідовності є сумою двох чисел, що передують їй. Перші два числа в послідовності є обома 1.

Ось кілька перших термінів

1 1 2 3 5 8 13 21 34 55 89 ...

Напишіть найкоротший код, який:

  • Створює послідовність Фібоначчі без кінця.

  • Дано nобчислює nй термін послідовності. (1 або нульове значення)

Ви можете використовувати стандартні форми введення та виводу.

(Я дав обидва варіанти на випадок, якщо один простіше зробити на вибраній вами мові, ніж інший.)


Для функції, яка приймає n, слід підтримувати досить велике повернене значення (найбільше число Фібоначчі, що відповідає мінімальному розміру слова вашого комп'ютера, як мінімум).


Таблиця лідерів

Відповіді:


48

Perl 6, 10 символів:

Анонімний нескінченний список послідовностей фільонок:

^2,*+*...*

Такий же, як:

0, 1, -> $x, $y { $x + $y } ... Inf;

Отже, ви можете призначити його масиву:

my @short-fibs = ^2, * + * ... *;

або

my @fibs = 0, 1, -> $x, $y { $x + $y } ... Inf;

І отримайте перші одинадцять значень (від 0 до 10) за допомогою:

say @short-fibs[^11];

або з:

say @fibs[^11];

Зачекайте, ви також можете отримати перші 50 номерів з анонімного списку:

say (^2,*+*...*)[^50]

Це повертає:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169
63245986 102334155 165580141 267914296 433494437 701408733 1134903170 
1836311903 2971215073 4807526976 7778742049

І кілька простих орієнтирів:

real    0m0.966s
user    0m0.842s
sys     0m0.080s

З:

$ time perl6 -e 'say (^2, *+* ... *)[^50]'

EOF


Я б навіть не вважав ^2це замінником 0,1. +1
Конрад Боровський

2
Це більше не дійсне, вам доведеться записати це як |^2,*+*...*, що є такою ж кількістю байтів, як 0,1,*+*...*.
Бред Гілберт b2gills

5
Перл такий дивний.
Кіос

1
У якій версії Perl 6 була написана ця відповідь?
CalculatorFeline

3
@CalculatorFeline Була велика зміна, відома як GLR (Great List Refactor), яка сталася незадовго до першого офіційного релізу, який відбувся у 2015-12-25. Цей код працював би до цього часу.
Бред Гілберт b2gills

73

Брейнфук, 22 удари

+>++[-<<[->+>+<<]>>>+]

Створює послідовність Фібоначчі, поступово рухаючись по стрічці пам'яті.


5
Гарний! Літерально красива! А може й ні ... все одно +1 для цього :)
Per Hornshøj-Schierbeck,

2
Це 3.344 або 4 байти в стисненому мозковому слові. (6 ln (22)) / ln (256)
Буде Шервуд

24
16 байт:+[[<+>->+>+<<]>]
прим

3
14 байт:+[.[>+>+<<-]>]
Шарлім

2
@Stefnotch звичайно, коротший - руйнівний. Наведений вище рішення закінчується послідовністю напруженості на стрічці, що і 16-байтне рішення.
примо

51

Haskell, 17 15 14 символів

f=1:scanl(+)1f

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


4
Чому б не вирізати два пробіли f=0:scanl(+)1 f?
Р. Мартіньо Фернандес

@Martinho: Відредаговано, дякую.
Анон.

Нічого собі, це навіть коротше, ніж зазвичай f@(_:x)=0:1:zipWith(+)f x! Треба це пам’ятати.
FUZxxl

4
Ви можете навіть роздягнутися інше простір: f=0:scanl(+)1f.
FUZxxl

37

C # 4, 58 байт

Потік (69; 65 при слабкому наборі IEnumerable)

(Припускаючи usingдирективу для System.Collections.Generic.)

IEnumerable<int>F(){int c=0,n=1;for(;;){yield return c;n+=c;c=n-c;}}

Одиничне значення (58)

int F(uint n,int x=0,int y=1){return n<1?x:F(n-1,y,x+y);}

6
Враховуючи, що nце є uint, n==0його можна скоротити до n<1. А потік може зберегти кілька символів, вибравши простір після загального типу та оголосивши його xв більш широкому обсязі, ніж потрібно. Насправді ров xцілком:n+=c;c=n-c;
Пітер Тейлор

1
@Peter: Дякую, редагую, коли отримаю певний час.
Джон Скіт

Ваша однозначна версія до тих пір, як відповідь мого рекурсивного лямбдаського виразу ... приємно!
Ендрю Грей

1
@ wizzwizz4, якщо я не помиляюся, якщо !nпрацює, то так слід, nякщо ви перевернете умовне.
Кіос

3
@JonSkeet Aw І тут я думав, що побив Джона Скіта в C # ... :-)
wizzwizz4

32

GolfScript, 12

Зараз всього 12 символів!

1.{.@.p+.}do

+1 приємна робота. Якщо ви зробите це коротше ніж на 13 знаків, я негайно прийму вашу відповідь (якщо, звичайно, хтось не зробить ще коротшої відповіді). :-P
Кріс Єстер-Янг

1
Я люблю виклик. Готово! ;-)
jtjacques

Приємно, ви перемагаєте. Принаймні, поки хтось не зробить щось ще коротше (якщо це навіть можливо). :-P
Кріс Шестер-Янг

5
це визначення є майже таким же коротким, як сама назва "Фібоначчі"! +1
агент-j

23

> <> - 15 символів

0:nao1v LF a+@:n:<o

Хоча ви можете скоротити його, 0:nao1v LF a+@:n:<oякщо хочете. Дає 15 :) Насправді це також робить результат трохи читабельнішим ...
tomsmeding

5
13 символів:01r:nao$:@+$r
випадкова

21

J, 10 символів

Використовуючи вбудований розрахунок коефіцієнтів серії Тейлора, тому, можливо, мало обманливо. Дізналися тут .

   (%-.-*:)t.

   (%-.-*:)t. 0 1 2 3 4 5 10 100
0 1 1 2 3 5 55 354224848179261915075

2
@aditsu (q:^-^:p) 6- це місце, 64 729де p рівний. J, мабуть, хороший тим, що робить загадки. :)
randomra

2
Ще краще: (<:^-^:>) 4є 81і <:^-^:> 4є 53.5982.
randomra

2
Емоджи, продемонстровані тут, до чого повинен прагнути весь J-код. З іншого боку, іншою альтернативою є +/@:!&i.-використання 9 байт.
милі

1
@miles Дуже приємно! Ви повинні розмістити його, оскільки він повністю відрізняється від мого.
randomra

21

Шестикутник ,18 14 12

Дякую Мартіну за 6 байт!

1="/}.!+/M8;

Розширено:

  1 = "
 / } . !
+ / M 8 ;
 . . . .
  . . .

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


Старий, відповідай. Це не вдається, оскільки зображення та пояснення можуть бути корисними новим користувачам Hexagony.

!).={!/"*10;$.[+{]

Розширено:

  ! ) .
 = { ! /
" * 1 0 ;
 $ . [ +
  { ] .

Це друкує послідовність Фібоначчі, розділену новими рядками.

Спробуйте в Інтернеті! Будьте уважні, однак інтернет-перекладач не дуже любить нескінченний вихід.

Пояснення

У цій програмі є дві "підпрограми", кожна з яких управляється одним із двох використаних IP-адрес. Перший розпорядок друкує нові рядки, а другий здійснює обчислення та вихід Фібоначчі.

Перша підпрограма починається з першого рядка і весь час рухається вліво вправо. Він спочатку друкує значення вказівника пам'яті (ініціалізований до нуля), а потім збільшує значення вказівника пам'яті на 1. Після відключення IP-адреси переходить до третього рядка, який спочатку переходить на іншу комірку пам'яті, після чого друкує новий рядок. Оскільки новий рядок має позитивне значення (його значення 10), код завжди переходитиме до п’ятого рядка, наступного. П'ятий рядок повертає вказівник пам'яті на наше число Фібоначчі, а потім переходить на іншу підпрограму. Коли ми повернемося з цієї підпрограми, IP-код відскакує назад до третього рядка, виконавши не-оп.

Друга підпрограма починається у верхньому правому куті і починає рух на південний схід. Після безреактивного руху нам відбивається Захід по другій лінії. Цей рядок друкує поточне число Фібоначчі перед переміщенням вказівника пам'яті на наступне місце. Потім IP переходить до четвертого рядка, де він обчислює наступне число Фібоначчі, використовуючи попередні два. Потім він повертає управління до першої підпрограми, але коли вона повертається до управління програмою, вона продовжується, поки не зустріне стрибок, де вона відскакує над дзеркалом, яке спочатку використовувалося для вказівки на захід, оскільки повертається до другого рядка.


Попередні гарні картинки!

Ліва частина зображення - програма, права частина - пам'ять. Синє поле - це перший IP, і обидва IP-адреси вказують на наступну інструкцію, яку потрібно виконати.

enter image description here

Примітка. Малюнки можуть здаватися досить людям, які мають подібні обмежені вміння з програмами редагування зображень: PI додасть принаймні ще 2 ітерації, щоб використання *оператора стало більш зрозумілим.

Примітка 2: Відповідь алефальфи я побачив лише після написання більшості цього, я зрозумів, що він все ще цінний через розлуку, але фактичні частини Фібоначчі в наших програмах дуже схожі. Крім того, це найменша програма з шестикутниками, яку я бачив, використовуючи більше ніж один IP, тому я подумав, що все-таки варто було б зберегти: P


Ви повинні зв’язати те, що використовували для створення гарних фотографій, а потім покладіть посилання на esolangs.org/wiki/Hexagony .
mbomb007

1
@ mbomb007 Я використовував gimp, щоб створити кожен кадр вручну, а потім завантажив зображення на якийсь веб-сайт із створення gif. Хоча кілька разів під час цього процесу я думав зробити інструмент для цього, враховуючи, як це було нудно.
FryAmTheEggman

@FryAmTheEggman Вражає! Зробіть це викликом. Я впевнений, що хтось опублікує відповідь. : D Ще краще, якщо ви могли б створити веб-сайт, подібний до онлайн-перекладача риби.
mbomb007

@ mbomb007 Це може бути неабияким амбітним завданням на цьому веб-сайті, не кажучи вже про те, що, мабуть, буде багато страждати від того, щоб бути дійсно широким. Я не думаю, що я опублікую це, але не соромтеся робити це самостійно, якщо ви вважаєте, що у вас є гарний спосіб його представити. Крім того, я вважаю, що Тімві створив C # ide для шестикутників, хоча я ніколи не використовував її, тому що не переймався моно.
FryAmTheEggman

1
@ mbomb007 Іде живе тут , до речі, минулого разу забув зв’язати це.
FryAmTheEggman


17

Python 2, 34 байти

Python, використовуючи рекурсію ... тут з'являється StackOverflow!

def f(i,j):print i;f(j,i+j)
f(1,1)

15

Желе , 3 байти

+¡1

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

Як це працює

+¡1    Niladic link. No implicit input.
       Since the link doesn't start with a nilad, the argument 0 is used.

  1    Yield 1.
+      Add the left and right argument.
 ¡     For reasons‡, read a number n from STDIN.
       Repeatedly call the dyadic link +, updating the right argument with
       the value of the left one, and the left one with the return value.

¡ визирає на дві ланки зліва. Оскільки існує лише одне, воно повинно бути тілом петлі. Тому з введення читається число. Оскільки аргументів командного рядка немає, це число зчитується з STDIN.


12

Гольфскрипт - єдиний номер - 12/11/10

12 символів для отримання даних від stdin:

~0 1@{.@+}*;

11 символів для введення вже в стеку:

0 1@{.@+}*;

10 символів для подальшого визначення 1 як 0-го числа Фібоначчі:

1.@{.@+}*;

1
Варіант - "Обчислює, заданий n, n числом Фібоначчі". Тож викопайте ~і у вас є 11 символів, які беруть nна себе стек і залишають F_nна стеку.
Пітер Тейлор

12

Рубін

29 27 25 24 символів

p a=b=1;loop{b=a+a=p(b)}

Редагувати: зробив це нескінченним циклом. ;)


13
хтось помітив b=a+a=b- це паліндром? :)
st0le

2
так st0le зробив :)
gnibbler

Я знаю, що я спізнююсь на вечірку, але чи може хтось пояснити, як b=a+a=bпрацює частина? Я не можу обернути голову навколо цього.
Містер Лама

3
@GigaWatt, подумайте про це так, інструкції виконуються зліва направо ... такnewb=olda+(a=oldb)
st0le

Ви можете зберегти 2 символи, скориставшись loop:p 1,a=b=1;loop{p b=a+a=b}
Патрік Осіті

11

Математика, 9 чол

Fibonacci

Якщо вбудовані функції заборонені, ось чітке рішення:

Математика, 33 32 31 ряд

#&@@Nest[{+##,#}&@@#&,{0,1},#]&

#&@@Nest[{#+#2,#}&@@#&,{0,1},#]&32 символи.
chyanog

1
@chyanog 31:#&@@Nest[{+##,#}&@@#&,{0,1},#]&
Mr.Wizard

1
@ Mr.Wizard 24 символи (26 байт):Round[GoldenRatio^#/√5]&
JungHwan Min

1
або 23 символи (27 байт):Round[((1+√5)/2)^#/√5]&
JungHwan Min

10

DC (20 байт)

Як бонус, це навіть заплутано;)

zzr[dsb+lbrplax]dsax

EDIT: Я можу зазначити, що він друкує всі цифри у послідовності поля, якщо ви чекаєте досить довго.


13
Я б не називав це заплутаним - затуманений код повинен бути важким для розуміння, і що стосується dc, то код тут абсолютно простий.
Nabb

10

Прелюдія , 12 байт

Один з небагатьох викликів, де Prelude насправді є досить конкурентоспроможним:

1(v!v)
  ^+^

Для цього потрібен інтерпретатор Python який друкує значення у вигляді десяткових чисел замість символів.

Пояснення

У прелюдії всі рядки виконуються паралельно з вказівниками проходження вказівника, що проходить через програму. Кожен рядок має свій стек, який ініціалізується на нуль.

1(v!v)
  ^+^
| Push a 1 onto the first stack.
 | Start a loop from here to the closing ).
  | Copy the top value from the first stack to the second and vice-versa.
   | Print the value on the first stack, add the top two numbers on the second stack.
    | Copy the top value from the first stack to the second and vice-versa.

Цикл повторюється назавжди, тому що перший стек ніколи не матиме a 0 вершини.

Зауважте, що це починається з послідовності Фібоначчі 0.


10

Шестикутник , 6 байт

Неконкурентований, оскільки мова новіша, ніж питання.

1.}=+!

Безголовки:

  1 .
 } = +
  ! .

Він друкує послідовність Фібоначчі без жодного роздільника.


2
У цьому є невелика проблема, що він не друкує жодного роздільника між номерами. Однак це не зовсім добре визначено у виклику. (І я дуже щасливий, що хтось використовує Hexagony. :))
Мартін Ендер

9

TI-BASIC, 11

Легендарний гольфіст TI-BASIC Кеннет Хаммонд ("Weregoose") з цього сайту . Працює в O (1) час і вважає 0 0-м членом послідовності Фібоначчі.

int(round(√(.8)cosh(Anssinh‾¹(.5

Використовувати:

2:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     1

12:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     144

Як це працює? Якщо ви займаєтеся математикою, виявляється, що sinh‾¹(.5)це дорівнює ln φ, тому це модифікована версія формули Біне, яка округляється вниз, а не використовує (1/φ)^nтермін корекції. Для round(запобігання помилок округлення необхідний (до 9 знаків після коми).


8

К - 12

Обчислює число nі n-1число Фібоначчі.

{x(|+\)/0 1}

Просто число nthФібоначчі.

{*x(|+\)/0 1}

+1 Непогано! Якщо ви зможете скоротити його лише одним символом (і надати мені спосіб його перевірити), я прийму вашу відповідь. :-)
Кріс Єстер-Янг

Єдиним способом зменшити його було б замінити функцію викликом на відоме число: n (| + \) / 0 1 Перевірте її за допомогою цього інтерпретатора .
isawdrones


7

Ява, 55

Я не можу конкурувати з лаконічністю більшості мов тут, але можу запропонувати істотно інший і, можливо, набагато швидший (постійний час) спосіб обчислення n-го числа:

Math.floor(Math.pow((Math.sqrt(5)+1)/2,n)/Math.sqrt(5))

n- це вхід (int або long), починаючи з n = 1. Він використовує формулу Біне і округляє замість віднімання.


Мені подобається це рішення
Андреас

Це, здається, не працює для мене, але це рано, і я можу щось пропустити! Припускаючи, 0що це перше число в послідовності, це дає 0, 0, 1, 1, 3, 4, 8, 12, 21, 33перші 10 номерів
Shaggy

@Shaggy На жаль! Вибачте, я ввів помилку - виправлено зараз.
Ганс-Пітер Стрер

6

Рубін, 25 годин

Відповідь st0le скорочена.

p 1,a=b=1;loop{p b=a+a=b}

6
Насправді ви можете її ще більше скоротити, використовуючиa=b=1;loop{p a;b=a+a=b}
Вентеро

6
Отже, ви вирішите його відповідь? : P
mbomb007

6

FAC: функціональний APL, 4 символи (!!)

Не моя, тому розміщена як вікі спільноти. FAC - це діалект APL, який Гай-Чен Ту, очевидно, запропонував в якості докторської дисертації в 1985 році. Пізніше він написав статтю разом з Аланом Дж. Перлісом під назвою " FAC: Функціональна мова APL ". Цей діалект APL використовує "ледачі масиви" та допускають масиви нескінченної довжини. Він визначає оператор "iter" ( ) для забезпечення компактного визначення деяких рекурсивних послідовностей.

Монадичний («унарний») випадок - це в основному Хаскелл iterate, і визначається як (F⌼) A ≡ A, (F A), (F (F A)), …. Диадического ( «двійковий») випадку визначається кілька аналогічно для двох змінних: A (F⌼) B ≡ A, B, (A F B), (B F (A F B)), …. Чому це корисно? Ну, як виявляється, саме такий тип рецидивів має послідовність Фібоначчі. Насправді один із наведених прикладів - це

1+⌼1

виробляючи звичну послідовність 1 1 2 3 5 8 ….

Отже, ось, можливо, найкоротша можлива реалізація Фібоначчі мовою програмування, що не є новизною. : D


О, я випадково відкинув публікацію від спільноти як частину моєї (ручної) масової трансляції. Ну добре. ;-)
Кріс Єстер-Янг



6

Додо , 26 байт

	dot F
F
	F dip
	F dip dip

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

Як це працює

Функція F виконує всі важкі підйоми; вона визначається рекурсивно наступним чином.

F(n) = ( F(|n - 1|), F(||n - 1| - 1|) )

Щоразу, коли n> 1 , маємо | n - 1 | = n - 1 <n і || n - 1 | - 1 | = | n - 1 - 1 | = n - 2 <n , тому функція повертається (F (n - 1), F (n - 2)) .

Якщо n = 0 , то | n - 1 | = 1> 0 ; якщо n = 1 , то || n - 1 | - 1 | = | 0 - 1 | = 1 = 1 . В обох випадках спроби рекурсивних викликів F (1) викликають виключення " Передача" , тому F (0) повертає 0, а F (1) повертає 1 .

Наприклад, F (3) = (F (1), F (2)) = (1, F (0), F (1)) = (1, 0, 1) .

Нарешті, основна функція визначається як

main(n) = sum(F(n))

тому він додає всі координати вектора, поверненого F .

Наприклад, main (3) = sum (F (3)) = sum (1, 0, 1) = 2 .



5

Десмос , 61 байт

Гольф

Натисніть add sliderкнопку для n.

p=.5+.5\sqrt{5}
n=0
f=5^{-.5}\left(p^n-\left(-p\right)^{-n}\right)

Останній рядок - вихід.

Безумовно

Це функція.

\phi =\frac{1+\sqrt{5}}{2}
f_{ibonacci}\left(n\right)=\frac{\phi ^n-\left(-\phi \right)^{-n}}{\sqrt{5}}

5

Cubix , 10 байт

Неконкурентна відповідь, оскільки мова новіша за питання.

Cubix - це нова двовимірна мова від @ETHproductions, якщо код загорнутий на куб розміром з розміром.

;.o.ON/+!)

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

Це загортається на куб 2 х 2 наступним чином

    ; .
    o .
O N / + ! ) . .
. . . . . . . .
    . .
    . .
  • O вивести значення TOS
  • N натисніть нову лінію на стек
  • / відбивати північ
  • o вивести символ TOS
  • ; поп TOS
  • / відбиватися на схід після обходу куба
  • + додайте топ 2 значення стека
  • ! пропустити наступну команду, якщо TOS дорівнює 0
  • ) збільшення TOS на 1. Це суттєво стартує послідовність.

Це нескінченний цикл, який друкує послідовність з роздільником нового рядка. Скористайтеся тим, що більшість команд не спливає значення зі стека.
Якщо роздільник ігнорується, то це можна зробити за допомогою 5 байт.O+!)


5

Brainfuck, 16,15, 14/13 символів

+[[->+>+<<]>]  

Створює послідовність Фібоначчі і нічого не друкує. Крім того, він коротший, ніж вище.

+[.[->+>+<<]>]   

Цей символ містить 14 символів, але виводить символи ASCII зі значеннями послідовності Фібоначчі.


1
Це добре, але чи помиляюся я, кажучи, що версія 14 байт виводить лише з другої 1 на? Як у "1 2 3 5 8" замість "1 1 2 3 5 8"?
Шарлім

1
@Charlim О, ти маєш рацію. Я поняття не маю, що думав мене 2014 року. У будь-якому випадку, я просто це виправив, перемістивши інструкцію з друку на передню частину циклу.
Стефнотч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.