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).

Примеры

Пример 1

Оценка объектов, заданных бесконечной рекурсией, производит ошибку:

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

Пример 2

Если максимальная глубина рекурсии достигнута, то это не обязательно означает, что бесконечная рекурсия включена. Рекурсивная процедура выполнения вычисляет факториал неотрицательного целого числа. Если мы устанавливаем максимальную глубину рекурсии до меньшего значения, чем необходимый вычислять, то ошибка происходит:

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:

Смотрите также

Функции MuPAD