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