Все мы знаем, когда используются циклы 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.