Студенты с моей кафедры жгут. Хоть смейся, хоть плач, хоть затачивай топор...
Цитирую
------ 3. Сравнительный анализ императивной и функциональной программ.
Исходный код программы на С++ занимает около 60 строк текста, программы на Haskell – около 20 строк. Таким образом, функциональная программа значительно компактнее, что можно объяснить относительной простотой синтаксиса и частым использованием рекурсии. Следует также отметить, что функциональные программы лучше структурированы. Это связано с самой идеологией функционального программирования. Программа, написанная на функциональном языке, всегда имеет чёткую структуру и по определению легко делится на блоки (блоками этими являются ни что иное, как функции).
В то же время функциональные программы гораздо более сложны в написании, чем императивные. Связано это с тем, что императивный стиль программирования не предполагает жёсткой связи между отдельными логическими блоками программы. Функциональный же стиль, напротив, предполагает, что блоки (функции) используют друг друга или самих себя (т.е. имеет место рекурсия). Функциональные языки программирования требуют от разработчика умения в уме просчитать результат выполнения функции, передачи результата в качестве параметра другой функции и т.д. Вероятность допустить ошибку в этом случае гораздо выше, чем в случае «обычного» для императивного стиля программирования выполнения действий одного за другим. Таким образом, написание сложной программы на Haskell превращается в очень нелегкую задачу, так как при этом приходится держать в уме слишком много факторов сразу, особенно если приходится использовать рекурсию.
По тем же причинам императивные программы являются более читабельными. Временная сложность обеих программ линейно возрастает с удлинением входной строки, в то же время зависимость временной сложности функциональной программы от длины слова является квадратичной. Функциональная программа потребляет гораздо больше памяти, причём зависимость этого параметра от длины входной строки является квадратичной. Это связано с использованием рекурсии и тем, что каждый вызов функции требует дополнительного выделения памяти для размещения в ней своих параметров.