MAXLEVEL

Предотвратите бесконечную рекурсию во время оценки

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Описание

Переменная окружения MAXLEVEL определяет максимальную глубину замены идентификаторов. Когда эта глубина замены достигнута, ошибка происходит.

Возможные значения: целочисленные большие 2; максимальное значение зависит от operationg системы, смотрите ниже.

Когда объект MuPAD® оценен, идентификаторы, происходящие в нем, заменяются их значениями. Это происходит рекурсивно, т.е. если сами значения содержат идентификаторы, то они заменяются также. MAXLEVEL определяет максимальную глубину рекурсии этого процесса. Если глубина замены, MAXLEVEL достигнут, то ошибка происходит.

Цель MAXLEVEL состоит в том, чтобы обеспечить эвристику для распознавания бесконечной рекурсии относительно замены идентификаторов их значениями, как в delete a: a := a + 1; a. Если бы в этом примере глубина замены не была бы ограничена, то a + 1 заменяли бы a бесконечно часто, и система “зависнет”.

Точно так же переменная окружения MAXDEPTH обеспечивает эвристику для распознавания бесконечной рекурсии относительно вызовов функции; смотрите соответствующую страницу справки для деталей.

Существует близкая связь между LEVEL и MAXLEVEL. Если глубина замены, LEVEL достигнут во время процесса оценки, то остановки рекурсии и любые остающиеся идентификаторы остаются неоцененными, но никакая ошибка не происходит.

Таким образом, если MAXLEVEL > LEVEL, то MAXLEVEL не имеет никакого эффекта. По умолчанию LEVEL и MAXLEVEL имеют то же значение 100 на интерактивном уровне. Однако значением по умолчанию LEVEL в рамках процедуры является 1, и таким образом обычно MAXLEVEL не имеет никакого эффекта в рамках процедур.

Существуют некоторые заметные различия между LEVEL и MAXLEVEL. Значение LEVEL зависит от контекста, а именно, происходит ли оценка на интерактивном уровне или в процедуре. Кроме того, некоторые системные функции, такие как context и level, не уважают текущее значение LEVEL. Напротив, MAXLEVEL является связанной глобальной переменной. Это работает как последнее прибежище, когда управление оценки через LEVEL перестало работать.

Значением по умолчанию MAXLEVEL является 100; MAXLEVEL имеет это значение после запуска или сброса системы через reset. Также команда delete MAXLEVEL восстанавливает значение по умолчанию.

MAXLEVEL является глобальной переменной. Используйте оператор save MAXLEVEL в процедуре, чтобы ограничить любые изменения в MAXLEVEL к этой процедуре.

Максимальное значение MAXLEVEL зависит от операционной системы. Под Windows® это 213 = 8192. Под операционными системами UNIX® максимальное значение зависит от максимального размера C-стека. С размером стека по умолчанию 8 MB значение 8192, также; с большим размером стека это может быть больше (в ударе, размер стека может быть установлен с ulimit -s).

Примеры

Пример 1

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

delete a: a := a + 1: a
Error: Recursive definition: Reached maximal evaluation level.

Это также работает на взаимно рекурсивные определения:

delete a, b: a := b^2: b := a + 1: b
Error: Recursive definition: Reached maximal evaluation level.

Пример 2

Если MAXLEVEL меньше или равен LEVEL, как значение по умолчанию на интерактивном уровне, то объекты оценены полностью до глубины MAXLEVEL-1, и ошибка происходит, если глубина замены, MAXLEVEL достигнут, включено ли рекурсивное определение или нет:

delete a, b, c, d:
a := b: b := c: c := 7: d := d + 1:
MAXLEVEL := 2: LEVEL := 2: c

a
Error: Recursive definition: Reached maximal evaluation level.
d
Error: Recursive definition: Reached maximal evaluation level.

С другой стороны, MAXLEVEL не имеет никакого эффекта, если он превышает LEVEL. Затем любой объект оценен до глубины в большей части LEVEL, и “рекурсивное определение” ошибка не происходит:

MAXLEVEL := 3: a, b, c, d

В частности, MAXLEVEL обычно не имеет никакого эффекта в рамках процедур, где LEVEL по умолчанию имеет значение 1:

MAXLEVEL := 2:
p := proc() begin a, d end_proc:
p();
delete MAXLEVEL, LEVEL:

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

Функции MuPAD