Наиболее очевидная опасность заключается в бесконечной рекурсии. Если вы
неверно построите алгоритм, то функция может пропустить основное условие и вы-
полняться бесконечно.
Проще всего допустить эту ошибку, если не указать условие установки, как это
сделано в следующей ошибочной версии функции вычисления факториала. По-
скольку функция не проверяет, достигнуто ли условие остановки рекурсии, она
будет бесконечно вызывать саму себя.
function BadFactoriaKnum : Integer) : Integer;
begin
BadFactorial := num*BadFactorial(num-1);
end;
Функция будет зацикливаться, если основное условие не учитывает все воз-
можные пути рекурсии. В следующей версии функция вычисления факториала
будет бесконечной, если входное значение - не целое число или оно меньше 0. Эти
значения неприемлемы для функции факториала, поэтому в программе, которая
использует эту функцию, может потребоваться проверка входных значений на до-
пустимость.
function BadFactorial2(num : Double) : Double;
begin
if (num=0) then
BadFactorial2 := 1
else
BadFactorial2 := num*BadFactoria!2(num-1);
end;
Следующий пример функции Фибоначчи более сложен. Здесь условие оста-
новки учитывает только некоторые пути развития рекурсии. При выполнении этой
функции возникают все те же проблемы, что и при выполнении функции факто-
риала BadFactorial2, когда задано нецелое или отрицательное число.
function BadFib(num : Double) : Double;
begin
if (num=0) then
BadFib := 0
else
BadFib := BadFib(num-1)+BadFib(num-2);
end;
Последняя проблема, связанная с бесконечной рекурсией, состоит в том, что
«бесконечная» в действительности означает «до тех пор, пока не будет исчерпана
вся память стека». Даже корректно написанные рекурсивные процедуры иногда
приводят к переполнению стека и аварийному завершению работы. Следующая
функция, которая вычисляет сумму N + (N-1) + ... + 2 + 1, исчерпывает память
стека компьютера при больших значениях N. Максимальное значение N, при кото-
ром программа еще будет работать, зависит от конфигурации вашего компьютера.
function BigAdd(n : Double) : Double;
begin
if (n<=l) then
BigAdd := 1
elee
BigAdd := n+BigAdd(n-l) ;
end;
|