Все мы знаем, когда используются циклы FOR и WHILE. FOR используется, когда цикл необходимо выполнить в течение фиксированного числа итераций. WHILE используется, когда количество итераций неизвестно. Вместо этого мы постоянно проверяем, соответствует ли он определенным критериям, и если да, то останавливаем цикл. (Извините, люди, я знаю, что это паршивое введение 😞. Но я не мог придумать ничего лучше).

Но давайте будем честными, мы все сталкиваемся с ситуацией, когда мы неправильно набираем «условный оператор» (это технический термин, а не критерий), и цикл уходит в бесконечность. После этого ищем способы уничтожить компьютер от злости 😡 и тоски 😠. И если мы не сможем выполнить условие во второй раз, то это практически ад. Итак, как нам обойти это?

Просто используйте FOR вместо WHILE.

Я знаю, о чем ты думаешь.

Вы думаете: «Но логика не подходит. Мы уже знаем, что у них разные цели!» и вы правы. Я могу объяснить…
Мы пишем код, используя комбинацию FOR и IF. Посмотрите, все ли идет в правильном направлении. В конце замените FOR и IF на WHILE. Звучит правильно! 🤥. Не так хорошо на самом деле. Вот увидишь.

Рассмотрим, например, этот код: Напишите код для решения x² — 4 = 0 методом проб и ошибок с ошибкой 5%. Мы знаем, что ответ равен 2. При 5%-ной ошибке он должен быть где-то между 1,9 и 2,1.

Сначала мы выбираем случайное число и оцениваем x² — 4, как показано на рисунке.

clear all;
x = rand();
a = x^2 - 4;

Если a не равно 0, измените его, иначе напечатайте как ответ

clear all;
x = rand();
a = x^2 - 4;
if abs(a) > 0.05
  % i have to do something here %
else
  fprintf('Answer x = %f\n', x);
end

Если а положительно, то выбранное число больше желаемого ответа. Итак, уменьшите его. Я выбираю уменьшение на 10%. В противном случае увеличьте его на 10%.

clear all;
x = rand();
a = x^2 - 4;
if abs(a) > 0.05
  if a > 0
    x = 0.9 * x;
  else
    x = 1.1 * x;
  end
    fprintf('Answer x = %f\n', x);
end

Теперь запустите код пару раз, используя цикл FOR, и посмотрите, правильно ли он написан…

x = rand();
for i = 1:50
  a = x^2 - 4;
  if abs(a) > 0.05
    if a > 0
      x = 0.9 * x;
    else
      x = 1.1 * x;
     end
  else
      fprintf('Answer x = %f\n', x);
  end
end

Если вы видите, что значение x приближается к 2 (это правильный ответ, как мы его знаем), значит, вы написали код правильно. Теперь самое время заменить FOR на WHILE.

clear all;
x = rand();
a = x^2 - 4;
while abs(a) > 0.05
   a = x^2 - 4;
   if abs(a) > 0.05
     if a > 0
       x = 0.9 * x;
     else
       x = 1.1 * x;
     end
   else
     fprintf('Answer x = %f\n',x);
   end
end

В строке 6 абс(а) > 0,05 оценивается во второй раз (первый раз в строке 4). Итак, нам нужно удалить это, чтобы сделать наш код более эффективным. Но ждать. Куда мне поместить fprintf в разделе else 🤔. Его нужно поставить в конце программы.

clear all;
x = rand();
a = x^2 - 4;
while abs(a) > 0.05
   a = x^2 - 4;
     if a > 0
       x = 0.9 * x;
     else
       x = 1.1 * x;
     end
end
fprintf('Answer x = %f\n',x);

Выполните код, и вы найдете примерно 10% ошибки. Подожди !!! Условное по-прежнему 0,05, что составляет 5%. Тогда почему цикл while резко останавливается при ошибке 10%. В выводе нет сообщений об ошибках!

Теперь я оставляю это в умелых руках моей аудитории, чтобы выяснить, почему это происходит. Но вы правильно поняли! (Дело в том, что 1 строчка может изменить вашу жизнь). Вот почему вы не должны работать с циклом FOR и НАДЕЯТЬСЯ, что замените его циклом WHILE и все еще будете ожидать, что он будет работать правильно.

Надежда — хороший завтрак, но плохой ужин — Фрэнсис Бэкон

Я знаю, что вы кипите от гнева, потому что весь блог до сих пор оказался бесполезным. Но поверьте мне, я имел в виду. Итак, давайте зададим вопрос еще раз. Можно ли работать с циклом WHILE, но не допустить, чтобы он уходил в бесконечность, если мы вводим неверное условие? Не волнуйтесь! Это возможно.

Это возможно, поддерживая отдельный счет в цикле. Вы начинаете с…

clear all;
x = rand();
a = x^2 - 4;

Напишите цикл WHILE следующим образом…

clear all;
x = rand();
a = x^2 - 4; % By the way, this step is called initialisation
while abs(a) > 0.05
  % do something over here %
  a = x^2 - 4;
end
fprintf('Answer x = %f\n',x);

Выполните его, и он пойдет на бесконечные итерации. Итак, напишите счетчик…

clear all;
x = 0.1;
a = x^2 - 4;
count = 0;
while abs(a) > 0.05 && count < 200
  % do something over here %
  a = x^2 - 4;
  count  = count + 1;
end
fprintf('Answer x = %f\n',x);

Если а положительно, то выбранное число больше желаемого ответа. Итак, уменьшите его. Я выбираю уменьшение на 2%. В противном случае увеличьте его на 2%

clear all;
x = rand();
a = x^2 - 4;
count = 0;
while abs(a) > 0.05 && count < 200
  if a > 0
    x = 0.98 * x;
  else
    x = 1.02 * x;
  end
  a = x^2 - 4;
  count  = count + 1;
end
fprintf('Answer x = %f\n',x);

Вот оно! Вот как мы работаем с циклом WHILE без постоянного сбоя компьютера. Как только вы будете достаточно уверены, вы можете удалить «счетчики». И я думаю, что теперь интуитивно понятно, что WHILE — это гибрид. Это комбинация FOR и IF.