Сейчас я изучаю С#. Во общем учил я учил и решил написать сам программу. Программа должна была рассчитывать последовательность Фибоначи до заданного числа. Начал писать и нагородил такого, с массивами, классами и прочим, что плюнул и посмотрел в интернете решение. Оказалось блин, все очень просто в одну функцию + чуть чуть пришлось изменить под мое условие.
Знакомый программист сказал, что я не знаю алгоритмов. Я начал искать материал по данному вопросу и нашел «Искусство программирования. Тома 1-4» Кнут Д…
Вопросы:
1. С какого тома лучше начать начинающему программисту, чтобы начать правильно думать и строить алгоритмы?(А то 2929 страниц просто угнетают если с начало до конца читать )
2. Может есть какие нибудь более подходящие книги или статьи или еще что — нибудь, для начинающего программиста, по данной теме?
Мне кажется лучше начинать с Кормена, а не Кнута. Или еще с кого попроще, можно с какого-нибудь буржуйского учебника по дискретной математике(буржуйского, потому, что там книги в себе много объединяют и разжёваны как для младенцев)
Кстати, это не значит, что нужно погрязнуть в алгоритмах и отложить программирование. Больше пишите, параллельно изучайте алгоритмы. Алгоритмы нужны всегда не во всех сферах. Т.е. их знание улучшит Ваш код, но их не знание не является барьером к его написанию в сферах, где алгоритмы не являются необходимой базой.
В вашем случае, проблема с пониманием рекурсии.
Для фибоначи — рекурсивная функция в одну строчку.
Алгоритмы знать полезно тем, что из всех наиболее известных алгоритмов сортировки или поиска можно выбрать тот, который больше всего подходит/понравился, останется закодить по готовой схеме.
Понимание конструкций и возможностей языка — куда более выгодный вектор развития, если это освоить, получится самостоятельно придумывать и реализовывать алгоритмы, а там уже и Кнута почитать полезно.
1) рекурсия будет оооочень долго работать на больших числах (там в общем и целом получается O(\phi^n)
2) написав итеративно можно получить тоже самое число за O(n)
3) понимая принципы линейной алгебры и комбинаторики, задачу можно решить за O(log n)
Так что нельзя сказать, что понимание конструкций языка более выгодно. Сначала нужно представить модель того, что будет писаться, а это делается только со знанием алгоритмов, а уже потом выбирать конструкции, которые это дело смогут реализовать.
Кнут очень трудный для понимания... Он даже спецовую дополнительную книгу написал в которой материал для подготовки к чтению его основных книг)
Начните читать Кормена "Алгоритмы. Построение и анализ". Если покажется слишком сложным, то тогда одну из этих книг:
Вирт Н. - Алгоритмы и структуры данных
Дж. Макконнел Основы современных алгоритмов
Во всех этих книгах есть описания самих алгоритмов/структур данных и псевдокод этого всего. Будет очень полезно, если вы 65% алгоритмов из книги закодите самостоятельно, смотря на псевдокод или описание. Таким образом вы прокачаете и алгоритмы и особенности выбранного языка)
P.S. Насчет дополнительной книги мог спутать с каким-то другим автором)