Этот пост адресован тем, кто считает наличие exit/break внутри цикла плохим тоном. В идеале, тем, кто может показать,
чем это плохо, но где ж таких возьмешь
Те, кто лепит exit/break в теле цикла без малейших колебаний, могут дальше не читать.
Как известно, смерть Кощея находится в игле, игла в яйце, яйцо в утке, утка в зайце, заяц в сундуке. Сундуков у нас много (массив), а задачи рассмотрим две.
1. Найти первую смерть Кощея, т. е., иглу (считаем, что таких сундуков может быть много).
2. Найти первый сундук, в котором нет смерти – там чего-нибудь не хватает.
Ограничения такие: разборка предметов стоит дорого, и после выхода из цикла недостаточно иметь индекс сундука. Нужно сохранить промежуточные переменные, содержавшие смерть. Использовать функцию, чтобы упрятать разборку, недопустимо, по причине снижения эффективности.
Кстати, басни про преждевременную оптимизацию здесь неуместны еще и потому, что вариант с функцией безобразен (на Обероне и пр.). Она по-любому будет иметь побочные эффекты (менять внешние переменные или параметры) и будет не строгой функцией, а черт знает чем.
Строгая функция могла бы возвращать кортеж, содержащий булев результат и запчасти разборки, но я плохо представляю, как запихнуть все это в заголовок цикла. Этот вариант можно привести для интереса, но по эффективности он не проходит.
При данных ограничениях мне приходят в голову только решения, использующие exit/break
Некрасиво, но что поделаешь…
Вот решения на псевдокоде, неотличимом от C#.
Я оцениваю ситуацию как неудовлетворительную. С одной стороны, задача банально-тривиальная. C другой стороны, я вынужден морщиться и идти на компромисс.
Все дело в недостатке выразительных средств.
Что предлагается сделать.
Изобрести (или вспомнить где-то реализованную) конструкцию для цикла, которая позволяла бы записать решение без компромиссов, образцово-показательно, эффективно.
ИКР, короче. Идеальный конечный результат.
Не следует ограничивать свою фантазию, речь идет, скорее, о языке мышления.