|
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 12
|
||||||
Числа Фибоначчи18.11.2018, 21:32. Показов 5299. Ответов 8
Здравствуйте.
Я начал осваивать Haskell недавно. В Википедии набрёл на следующее описание функции для получения бесконечной последовательности из чисел Фибоначчи за линейное время: fibs = 0:1:zipWith (+) fibs (tail fibs) Я пытался полазить по различным форумам, чтобы понять, как это работает, но никакой конкретики не нашёл. Как формально доказать, что эта функция работает за линейное время? (например если использовать take n fibs) Если попробовать попытаться посчитать, например, четвертое число Фибоначчи "в лоб", то получается нечто такое:
Если всё происходит так, как тут написано, то это совсем не похоже на линейное время. Третье число Фибоначчи мы считаем условно за два шага, а четвертое - за четыре. Даже боюсь представить, что будет происходить для 5 и далее чисел. Я четко осознаю, что скорее всего то ,что я тут написал, - это конченая ересь. Прошу не кидаться тапками, а помочь разобраться. Спасибо за понимание
0
|
||||||
| 18.11.2018, 21:32 | |
|
Ответы с готовыми решениями:
8
Числа фибоначчи Вычислить номер первого числа Фибоначчи, которое меньше 999888 [R] Числа Фибоначчи |
|
Супер-модератор
|
|||||||
| 19.11.2018, 08:19 | |||||||
0
|
|||||||
|
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 12
|
||
| 19.11.2018, 08:59 [ТС] | ||
|
Если просуммировать, то получится грубо говоря арифметическая прогрессия: Sigma(i,N) N = N*(N-1)/2 В итоге получается тот же квадрат. А, например, итеративное решение занимает именно линейное время, ведь ресурсоемкость итераций цикла практически не меняется. Может быть, на самом деле эта функция работает не так, как я написал?
0
|
||
|
Супер-модератор
|
||
| 19.11.2018, 09:14 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 12
|
|||||||
| 19.11.2018, 09:21 [ТС] | |||||||
|
А как можно вычислить с помощью
0
|
|||||||
|
|
||||||
| 19.11.2018, 09:33 | ||||||
Сообщение было отмечено PrestoConFuoco как решение
Решение
Как ты уже, наверное, понял, Хаскель высокоуровневый ЯП, который основан на лямбда-исчислении.
Поэтому все задаваемые вопросы могут быть разделены условно на два класса: те, которые относятся чисто к синтаксису и семантике языка и, как правило, могут быть перефразированы в терминах лямбда-исчисления, и те, которые также касаются реализации языка (интерпретатора, транслятора и т.п.) Вопрос о времени исполнения как правило рассматривается в контексте конкретной реализации. Впрочем, вне реализации вопрос тоже можно поставить, и он будет интересным. Если же мы рассматриваем GHC, то он умеет делать (пусть знающие люди подскажут правильное название) графовую редукцию. Суть заключается в том, что переменной fibs сопоставляется граф выражения по правую сторону, в котором fibs является вершиной. Таким образом, в этом графе появляется цикл. При вычислении граф преобразует, но из-за цикла новые копии fibs не создаются, поэтому будет что-то типа
где fibs' и fibs'' указатели на вершины графа значения fib. Таким образом, время на разворачивание (вычисление) графа линейно. Что же касается последнего вопрса, то, думаю, всё зависит от доступа к элементам и внутренней реализации структуры данных. Скажем, самопальный тип списка и take, реализованный через последовательный доступ к 1-му, 2-му ... n-му элементу будет работать квадратичное время. В то же время стандартное определение take с хвостовой рекурсией будет само работать за линейное время. Как устроена стадартная реализация списка в GHC, увы, не знаю. Но учтите, если будешь писать свой компилятор Haskell, оценка времени может оказаться другой, полиномиальной или экспоненциальной. Добавлено через 10 минут Не могу найти литературу. В книге Филд А., Харрисон П. Функциональное программирование (1993) есть раздел 11 про графовую редукцию, но, по-моему, это не про GHC. Похожая занимательная литература легко гуглится, например, Asperti A. On the complexity of beta-reduction, но, опять же, не уверен, что это применимо к GHC.
2
|
||||||
|
Супер-модератор
|
|||||||||||
| 19.11.2018, 10:41 | |||||||||||
|
Делаем так:
1
|
|||||||||||
|
Фрилансер
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
|
|
| 19.11.2018, 13:44 | |
|
А можно как-то посмотреть на более низком уровне, во что этот ряд реально разворачивается?
0
|
|
|
1 / 1 / 0
Регистрация: 11.11.2018
Сообщений: 12
|
|||||||
| 20.11.2018, 00:06 [ТС] | |||||||
|
Mysterious Light,
Спасибо. Кажется, до меня немного дошло. Разница между моим вычислением и вашим - в том, что у меня подставляется каждый раз fibs, из-за чего все вычисления нужно проводить по много раз. Попробую продолжить ваш пример, чтобы убедиться, что я правильно его воспринимаю:
Что касается графов, я к сожалению мало что понял из того, что вы об этом написали. Но наверное главное, что я понял - что мне нужно заняться в ближайшее время теорией графов Надеюсь, когда-нибудь дело дойдет и до этого примера.
1
|
|||||||
| 20.11.2018, 00:06 | |
|
Помогаю со студенческими работами здесь
9
По заданному числу Фибоначчи найти предыдущее и следующее числа Фибоначчи Вычисление чисел Фибоначчи и номера числа Фибоначчи с накопителями Последовательность Фибоначчи. Сумма в последовательности Фибоначчи для числа N
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|