Другая, опасность рекурсии - это бесполезный расход памяти. При каждом
вызове подпрограммы система выделяет память для локальных переменных но-
вой процедуры. Для обработки сложной цепочки рекурсивных обращений компь-
ютеру потребуется значительная часть ресурсов для размещения и освобождения
памяти для переменных. Даже если программа при этом не исчерпывает всю па-
мять стека, на управление переменными будет затрачено много времени.
Есть несколько способов сокращения этих затрат. Во-первых, не используйте
ненужные переменные. Следующая версия функции BigAdd заполняет всю па-
мять стека быстрее, чем предыдущая версия. Команда а [ Random ( 9 9 ) ] : = 1 не
дает компилятору оптимизировать код и удалить массив.
function BigAdd(n : Double) : Double;
var
a : array[0..99] of Longint;
begin
a[Random!99)] := 1;
if (n<=l) then
BigAdd := 1
else ,
BigAdd := n+BigAdd(n-l) ;
end;
Объявляя переменные глобально, можно сократить использование стека. Если
вы объявляете переменные вне процедуры, компьютеру не надо при каждом вызо-
ве процедуры выделять новую память. |