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: