привет-привет, по ссылке как раз обсуждался вопрос вычисления таким способом.
и хватит уже бомбардировать окружающих информацией, подробно изложенной в вики.
Какие матрицы? Какая Java? За деревьями не видно леса.
Тут вся фишка в корекурсии, в примере на Haskell'е это явно видно:
fibs = 0: 1: zipWith (+) fibs (tail fibs)
Ну во-первых: http://ru.wikipedia.org/wiki/Корекурсия, а для быстрого вычисления проще взять и сохранить пару достаточно больших чисел, чтобы вычислять не сначала, а с них. Самая быстрая прога будет, хотя задача все равно надуманная.
Ускорение ваш код во сколько раз дает по сравнению с решением в лоб? А то PROFIT не очевиден.
Кажется, я не очень понимаю использование приставки ко- применительно к computer science всякому. На хабре никто не писал о применении теории категорий в информатике? Было бы занимательно.
Ну для меня как программиста на Haskell'е связь очевидна. А вообще тема наверно все таки не достаточно раскрыта.
То же самое кстати можно на питоне написать через генераторы, но наверно будет не так эффективно (ленивость языка все таки гарантирует что все будет вычислятся только 1 раз в этом случае).
Вообще пример довольно тривиален, если уж писать топик про это, лучше за пример взять вычисление чисел Хемминга — вот уж где явно видно преимущество ленивых функциональных языков.
Ускорение будет с O(N) до O(log N). А учитывая реализацию длинной арифметики, то время сложения не является константным и поэтому у решения «в лоб» асимптотика на самом деле будет хуже O(N).
Это то и из кода видно, но хотелось бы видеть тесты с относительными и абсолютными значениями прироста, есть подозрение, что овчинка выделки не стоит. Лучше реально сохранить несколько пар предвычесленных чисел для больших N.
Еще мне смутно кажется, что возможна ошибка на больших N с таким подходом, хорошо бы сравнить результаты этого кода с референсной наивной реализацией.
Вы, мне кажется, не разбираетесь в математике и теории чисел))
Даже(!!!) в задачнике для школьников 9-10 классов мат.школы есть доказательство этой формулы. А вы, мусье, тролль.
Я не сомневался в самой формуле, я сомневался что при больших N там что-то где-то не обрежется. Несколько сложений и умножений больших чисел вполне могут вызвать переполнение.
И тестов я так и не увидел.
Вы один такой умный задумались что это может не работать, и тормозить побольше обычного подсчета?) Там внизу писалось, что на acm это часто используется, а там все, что может не работать, или работает медленно «ударит вас по затылку».
И зачем автору поста надо вам что-либо доказывать? у него есть дела поинтереснее, я уверен)
А я и не говорил что влияет, я просто говорил что проще запомнить нужное количество пар для больших N и начинать считать с них. скорее всего даже быстрее будет.
Ну это если вы знаете что вам нужно считать числа Фиббоначи
А если бы вам надо было решать какую-то неизвестную заранее реккурентную последовательность?
Мне казалось, слова «для большинства» и «бред» чётко читаются…
Спасибо, что написали немного осмысленного текста, остальным лишь бы щёлкнуть на крестик и убежать дальше :)
В этом примерчике хоть рекурсии нет, как зачастую, встречается… Покажут людям рекурсию на числах Фибоначчи, скажут, «круто», так по инерции и используется =)
И нечего пинать за то, что ещё не встречался с острой необходимостью находить действительно большие числа из этого ряда :)
У данной задачи есть 3 решения: «правильное», «хитрое» и «тупое». Мне не понятно почему Вы считаете правильное решение бредом. И что такое «большинство задач»? Надеюсь Вы не профессиональный программист.
Слава всем богам, пока только учусь :)
Хмм… Если бы написал правильное решение — не заминусовали бы(а я то что… набросал за минуту код, которым вполне реально вычислять требуемое, хоть и целесообразно только на меньших n), а решение, описанное в статье и не оспариваю. Просто не везде необходимо.
Можете про каждое решение написать по предложению?
Правильное — описанное в статье, или асимптотически равное ему.
Хитрое — решение с предподсчетом (precalc): Храним в массиве множество {F(i), I э i}. А когда получаем n, находим F(n) с помощью ближайшего числа из I. Получается «время против памяти».
Тупое — за O(n) посчитать.
Э… вообще-то существует простой способ как представить последовательность Фибоначчи как аналитическое выражение от n (Формула Бине). Это потому, что продвигающая систему матрица( [1 1; 1 0 ]) в n-степени имеет аналитическое представление.
Зачем тогда в коде цикл?
а смысл? если делать с плавающей арифметикой, скорее всего будет еще дольше + погрешность округления
если представлять числа в виде a+b*sqrt(5) и работать с 2-мерными векторами (a, b), то те же яйца получаются
Может и будет. Не унывайте, полезных статей в блоге «Спортивного программирования» редко прибывает, так что стараниям там рады.
Надо просто перед тем, как постить, посмотреть в колонку справа «похожие публикации», а еще выдерживать хороший стиль, где-то посередине между публицистическим и научным.
Подзод интересный, но верстка плывет и напсиано крайне непонятно, голову сломаешь от этих n и n+1. НЕ говоря о том, что хорошо бы упомянуть, что такое «оператор».
Нахождение чисел Фибоначчи