LINUX.ORG.RU
ФорумTalks

Простенькая задачка программистам


0

4

Задача: написать функцию для расчёта n-го числа Фибоначчи в одно выражение и без явного использования рекурсии. Желательно также уместить в одну строку. Мною получена применительно к Scala, но вы пишите на любом языке. Да, и ещё, это должен быть расчёт числа с использованием двух предыдущих, формулу для вычисления n-го числа сразу использовать нельзя.

★★★
Ответ на: комментарий от buddhist

А ещё говорят что perl непонятный. Однострочниками обзываются. Вот это я понимаю однострочник!

Xellos ★★★★★
()

«Потратил минут 20. Но морфизм есть!» (С)

Kuka ★★
()

Задача: написать функцию для расчёта n-го числа Фибоначчи в одно выражение и без явного использования рекурсии. Желательно также уместить в одну строку. Мною получена применительно к Scala, но вы пишите на любом языке. Да, и ещё, это должен быть расчёт числа с использованием двух предыдущих, формулу для вычисления n-го числа сразу использовать нельзя.

pcmatlab: http://upload.wikimedia.org/math/a/6/0/a6083f85f39b468210f5715a8e30d572.png (взято из википедии)

n=10;
a=[1,1;1,0];
b=a^n;
b(1,2)
т.е. в общем случае
a=[1,1;1,0];
a^n
правое-верхнее и левое-нижнее числа матрицы a^n - n-е число Фибоначчи, где n=0,1,2,3,4,...
правое-нижнее - F(n-1)

Neksys ★★★
()
Ответ на: комментарий от Deleted

Нет. ТС хотел посмотреть в каких языках есть соответствующие конструкции, чтобы решить задачу функционально. Например, варианты на хаскеле и мой — соответствуют условию.

baverman ★★★
()
Ответ на: комментарий от Harald

ну и что? Я не использовал инструкции сверх 8086. Просто взял другую разрядность.

luke ★★★★★
()
Ответ на: комментарий от damnemall

Ты не поверишь, но задача может быть сформулирована таким образом, что в то, что нужно войдёт то, как нужно.

luke ★★★★★
()
return ({ int res = !!n; for (int res1 = 0, i = 2;i <= n; ++i, res += res1, res1 = res - res1); res; });
Pavval ★★★★★
()

Напоминает троллейбус из хлеба.

thesame ★★★★
()

Постоянно забываю, в питоне же есть примитивный паттерн-матчинг:

fib = lambda n:reduce(lambda (a, b), _:(b, a + b), xrange(n), (0, 1))[0]
baverman ★★★
()

Вот еще вариант

fib =: {.@(2&x:)@((+%)/)@(0,$&1x)

Уже не такой короткий, но все так же элегантный.

buddhist ★★★★★
()
Ответ на: комментарий от baverman

> Нет. ТС хотел посмотреть в каких языках есть соответствующие конструкции

Нет, ТС просто хотел посмотреть на уродцев, которые родятся в указанных ограничениях.

Zenom ★★★
() автор топика

На будущее: ставьте в таких темах тег [специальная олимпиада].

segfault ★★★★★
()

> Задача: написать функцию для расчёта n-го числа Фибоначчи

на ЛОРе знают много языков, придуманных именно для этой задачи

aho
()

F#:

let fib n = [0..n-1] |> List.fold (fun (prev, st) _ -> st,st+prev) (0, 1) |> fst

> List.map fib [0 .. 13];;

val it : int list = [0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233]

Norgat ★★★★★
()

Это камбак с мощного наброса про ноду? Граждане толпами ломанулись считать фибоначей.

Vit ★★★★★
()
$ echo 100 | dc -e '1ddse?2-si[dsa+larled1+seli>c]dscxp'
354224848179261915075

Правда, из-за использованного алгоритма, даёт неверный результат если попросить показать число фибоначчи до третьего. Наверняка, можно сильно улучшить, но мне пока лень.

Xenius ★★★★★
()
Ответ на: комментарий от buddhist

> fib =: i. +/ .! i.@-

В вокабьюляре не нашел оператора .!, да и вообще, все операторы на точку или двоеточие кончаются, а не начинаются.

Xenius ★★★★★
()
Ответ на: комментарий от luke

> Да, школота не может выполнить задание и с гордостью заявляет об этом на ЛОРе.

Да, Люк! Ты такой проницательный! Прямо - ах!

VirRaa ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.