Циклы

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

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

Используйте циклы с постоянным числом итераций (циклы for)

Цикл for повторяет группу операторов для постоянного числа итераций. Цикл запускает с команды for и заканчивается end_for или только end. MuPAD® выполняет все операторы между этими двумя словами так много раз, как вы задаете. Например, вычислите факториал целого числа с помощью цикла:

x := 1:
for i from 1 to 5 do
  x := x * i;
end_for

Более эффективная альтернатива циклам for

Часто можно ускорять подписание кода MuPAD, заменяя циклы for на генератор последовательности $. Например, вместо цикла

x := 1:
for i from 1 to 10 do
  x := x * i;
end_for

используйте оператор:

`*`(i $ i = 1..10)

Управляйте размером шага и количеством вверх и вниз

По умолчанию цикл постепенно увеличивает значение счетчика 1 на каждом шаге. Можно изменить размер шага:

for i from 1 to 3 step 1/2 do
  print(i)
end_for

Чтобы считать в обратном направлении уменьшение значения счетчика с каждым шагом, вместо to, используют ключевое слово downto:

for i from 3 downto 1 do
  print(i)
end_for

Используйте математические структуры в циклах for

MuPAD поддерживает использование структур, таких как списки и матрицы в циклах for:

for i in [1, -4, a, b] do
  print(i^2)
end_for

s := 0:
for i in linalg::hilbert(3) do
  s := s + i^2
end_for

Используйте Циклы с Условиями (в то время как и повторяют Циклы),

Условие вначале (циклы с условием продолжения)

MuPAD поддерживает использование циклов с логическими условиями. Цикл while продолжается, в то время как условия выполнения допустимы. Цикл запускается с while и заканчивается end_while или только end. MuPAD выполняет все операторы между этими командами неоднократно, пока условия выполнения верны. В цикле while MuPAD оценивает условия перед каждой итерацией. Когда условие становится ложным, цикл останавливается, не выполняя операторы текущей итерации:

i := 2;
while i < 16 do
  i := i^2;
  print(i)
end_while:

Условие завершения в конце (повторяют циклы),

Цикл repeat продолжается, пока условие завершения не становится допустимым. Цикл запускается с repeat и заканчивается end_repeat. MuPAD выполняет все операторы между этими командами неоднократно, в то время как условия являются ложными. Цикл repeat тестирует условие завершения в конце каждой итерации. Когда условие становится верным, цикл останавливается после выполнения операторов текущей итерации:

i := 2;
repeat
  i := i^2;
  print(i)
until i >= 16 end_repeat:

Избегайте бесконечных циклов: установите счетчик

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

i := 1;
repeat
  print(i)
until i > 3 end_repeat:

Чтобы избежать этого бесконечного цикла, используйте дополнительный оператор, чтобы изменить его в каждой итерации:

i := 1;
repeat
  i := i + 1;
  print(i)
until i > 3 end_repeat:

Используйте несколько условий

Можно использовать несколько условий, комбинирующих выражения and, or, xor или другими логическими операторами:

i := 2:
j := 3:
repeat
  i := i*j;
  j := j^2; 
  print(i, j)
until i > 100 and j > 10 end_repeat:

i := 2:
j := 3:
repeat
  i := i*j;
  j := j^2; 
  print(i, j)
until i > 100 or j > 10 end_repeat:

Используйте вложенные циклы

Можно поместить один или несколько циклов в другом цикле. Внутренние циклы могут иметь те же или различные типы:

s := 0:
for i from 1 to 3 do
  for j from 1 to 2 do
    s := s + i + j;
  end_for
end_for:
print(s)

s := 0:
for i from 1 to 3 do
  j := 1:
  while j <= 2 do
    s := s + i + j;
    j := j + 1;
  end_while
end_for:
print(s)

Выйдите из цикла

Чтобы добавить возможность выйти из цикла, используйте команду break. Предположим, что вы хотите выйти из цикла, если некоторое условие верно:

for i from 1 to 3 do
  for j from 1 to 2 do
    if i = j then
      print(Unquoted, "i = j = ".expr2text(i));
      break
    end_if
  end_for
end_for:
i = j = 1
i = j = 2

Команда break позволяет вам выйти из цикла, в который вы помещаете эту команду. Если вы создаете вложенные циклы и используете break во внутреннем цикле, MuPAD продолжает выполнять операторы во внешних циклах:

for i from 1 to 3 do
  for j from 1 to 2 do
    if i = j then
      print(Unquoted, "break with i = j = ".i);
      break
    end_if;
    print(Unquoted, "i = ".i.", j = ".j);
  end_for
end_for:
break with i = j = 1
i = 2, j = 1
break with i = j = 2
i = 3, j = 1
i = 3, j = 2

Предположим, что вы хотите прекратить выполнить операторы и выходить из вложенных циклов, как только условие i = j верно. Используйте дополнительную переменную для состояния пропуска внутреннего цикла. Используйте эту переменную, чтобы выйти из внешнего цикла:

breakAll := FALSE:
for i from 1 to 3 do
  for j from 1 to 2 do
    if i = j then
      print(Unquoted, "break with i = j = ".i);
      breakAll := TRUE;
      break
    end_if;
    print(Unquoted, "i = ".i.", j = ".j);
  end_for;
  if breakAll then
    break
  end_if;
end_for:
break with i = j = 1

Пропустите часть итерации

Чтобы пропустить команды от конкретной точки в конец цикла и запустить следующую итерацию, используйте команду next:

for i from 1 to 3 do
  for j from 1 to 2 do
    if i = j then
      print(Unquoted, "i = j = ".expr2text(i));
      next
    end_if;
    print(Unquoted, "i = ".expr2text(i), "j = ".expr2text(j))
  end_for
end_for:
i = j = 1
i = 1, j = 2
i = 2, j = 1
i = j = 2
i = 3, j = 1
i = 3, j = 2

Возвращаемое значение цикла

Все команды MuPAD производят некоторые возвращаемые значения. Циклы в MuPAD возвращают результат последнего выполняемого оператора:

for i from 1 to 3 do
  x := 2*i;
  y := 3*i
end_for

Подавите вывод возвращаемого значения с двоеточием:

for i from 1 to 3 do
  x := 2*i;
  y := 3*i
end_for:

Отобразите промежуточные результаты

По умолчанию MuPAD не отображает промежуточные результаты, полученные в цикле, даже если вы используете точки с запятой после команд. Чтобы видеть промежуточные результаты, используйте команду print в цикле:

i := 1;
while i < 3 do
  i := i + 1;
  print(i)
end_while:

Чтобы отобразить результаты каждой итерации в цикле for, также используйте команду print:

for i from 1 to 5 do
  x := i!;
  print(Unquoted, expr2text(i)."! = ".expr2text(x))
end_for
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120