К третьему курсу университета, я как и положено студенту, считал, что знаю о программировании все и любую программу могу написать без проблем. Так вот на третьем курсе у нас появился предмет «Архитектура ЭВМ». Все лекции я обычно пропускал (не знаю как сейчас, а тогда была лафа в виде свободного посещения лекций), а с этим предметом обстоятельства сложились так, что мне пришлось сидеть на лекциях по независящим от меня причинам. К моему удивлению я обнаружил, что знаю о программировании далеко не все. Особенно поразил меня пример рекурсии.
Как написать программу для подсчета факториала числа n. Классический способ заключается в использовании цикла. Получается вот такая программка на языке Pascal.
function Fact( n : Integer) : Integer ; var i : Integer ; f : Integer ; begin f:=1 ; for i:=1 to n do f:=f*i ; Fact:=f ; end ;
Эта программа конечно работает, но можно написать более красивую программу с использованием рекурсии.
function Fact( n : Integer) : Integer ; begin if n=0 then Fact:=1 else Fact:=n*Fact(n-1) ; end ;
Вторая программа позволяет понять, что в программировании есть много интересных моментов и программа это не просто сборник циклов и операторов ветвления. Для того что бы написать программу надо, себе четко представлять, как компьютер будет ее выполнять. К сожалению далеко не все программисты представляют себе это. В итоге на свет появляются чудовищно не эффективные программы, это отдельная тема для обсуждения.