MAXDEPTH
Предотвратите бесконечную рекурсию во время вызовов процедуры
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
Переменная окружения MAXDEPTH
определяет максимальную глубину рекурсии вложенных вызовов процедуры. Когда эта глубина рекурсии достигнута, ошибка происходит.
Возможные значения: Положительное целое число; максимальное значение зависит от операционной системы, смотрите ниже.
Цель MAXDEPTH
состоит в том, чтобы обеспечить эвристику для распознавания бесконечной рекурсии относительно вызовов процедуры, как в p := x -> p(x): p(0)
. Если бы в этом примере глубина рекурсии не была бы ограничена, то процедура, которую p
вызывал бы сам рекурсивно бесконечно часто, и система, “зависнет”.
Если во время оценки объекта глубина рекурсии MAXDEPTH
достигнут, то вычисление прерывается с ошибкой.
Точно так же переменная окружения MAXLEVEL
обеспечивает эвристику для распознавания бесконечной рекурсии относительно замены значений для идентификаторов; смотрите соответствующую страницу справки для деталей и примеров.
Значением по умолчанию MAXDEPTH
является 500
; MAXDEPTH
имеет это значение после запуска или сброса системы через reset
. Также команда delete MAXDEPTH
восстанавливает значение по умолчанию.
MAXDEPTH
является глобальной переменной. Используйте оператор save MAXDEPTH
в процедуре, чтобы ограничить любые изменения в MAXDEPTH
к этой процедуре.
Максимальное значение MAXDEPTH
зависит от операционной системы. Под Windows® это 211 = 2048. Под операционными системами UNIX® максимальное значение зависит от максимального размера C-стека. С размером стека по умолчанию 8 MB
значение 2048, также; с большим размером стека это может быть больше (в ударе, размер стека может быть установлен с ulimit -s
).
Оценка объектов, заданных бесконечной рекурсией, производит ошибку:
p := proc() begin p() end_proc: p()
Error: Recursive definition: Reached maximal depth for nested procedure calls. Evaluating: p
Это также работает на взаимно рекурсивные определения:
p := proc(x) begin q(x + 1)^2 end_proc: q := proc(y) begin p(x) + 2 end_proc: p(0)
Error: Recursive definition: Reached maximal depth for nested procedure calls. Evaluating: p
Если максимальная глубина рекурсии достигнута, то это не обязательно означает, что бесконечная рекурсия включена. Рекурсивная процедура выполнения вычисляет факториал неотрицательного целого числа. Если мы устанавливаем максимальную глубину рекурсии до меньшего значения, чем необходимый вычислять, то ошибка происходит:
factorial := proc(n) begin if n = 0 then 1 else n*factorial(n - 1) end_if end_proc: MAXDEPTH := 4: factorial(5)
Error: Recursive definition: Reached maximal depth for nested procedure calls. Evaluating: factorial
Если мы устанавливаем MAXDEPTH
на 5, то глубина рекурсии является достаточно большой для вычисления. Команда delete MAXDEPTH
сбрасывает MAXDEPTH
к своему значению по умолчанию 500
:
MAXDEPTH := 5: factorial(5); delete MAXDEPTH: