Vlad писал(а):
P.S. Ну а дейкстровский WHILE - видимо из любви к искусству, практической ценности (хоть с учетом специфики ARM, хоть без) в нем никакой.
Влад, Вы обобщаете на пустом месте (отсутствии собств. опыта в этом плане). Мы уже говорили как-то, что у Вас (как и у меня, просто задачи такие) большинство циклов базовые - как Вы их называете, типа foreach и search (полный проход и лин. поиск). Ну-ка, припомните, когда последний раз приходилось строить цикл, в котором изменяются в связке много величин по нек. соотношению? А шашкой махать мы тут горазды, типа.
Теперь касательно общего WHILE. Цикл, вообще говоря, это описание некоторого процесса, по достижению какой-то цели (постусловия). Он обеспечивает "обратную связь" (пока не достигли цели, делаем...). В простом случае шаги этого процесса однородны (имеем просто последовательность неких состояний, по которой продвигаемся). Однако в общем случае шаги могут быть неоднородными.
Если наша цель выражается некоторым конъюнктом A & B, то условие продолжения цикла - дизъюнкт ~A OR ~B. А можно записать эквивалентно: цель - ~C & ~D, а условие - C OR D. Можно сказать, что до тех пор, пока есть одна из возможностей (C или D) для продвижения далее, то продвигаемся; когда возможности нет, то мы достигли цели. Так вот, вероятнее всего, что совершаемое действие будет различаться в зависимости от того, в силу какого дизъюнкта цикл продолжился. То есть, WHILE C OR D OR .. DO IF C THEN ... ELSIF D THEN ... ELSE ... END END.
Даю пример в студию. Из учебника Кушниренко (для школьников 8-9 кл. т.е.)
Вложение:
DijkstraCycle.png [ 322.43 КБ | Просмотров: 22176 ]
(Обращаю внимание, что по логике обучения у Кушниренко дети к моменту решения таких задач ещё не знают IF. Проходится декомпозиция на вспомогательные алгоритмы, затем for, затем while. Приведённое решение имеет методической целью а) показать пример сложного условия б) в очередной раз отработать пошаговую детализацию с разбиением на подзадачи и сведением к ранее уже решёным задачам. Обратите, кстати, внимание, насколько фундаментален WHILE - с его помощью и без IF можно выразить многообразное поведение)
На самом деле, не "методическое", а обычное решение выглядит, конечно, так:
Код:
WHILE СлеваСвободно() OR СверхуСвободно() DO
IF СлеваСвободно() THEN
Влево
ELSE
Вверх
END
END
Вот вам и пример поведения с неоднородными действиями, вот вам и цикл Дейкстры:
Код:
WHILE СлеваСвободно() DO
Влево
ELSIF СверхуСвободно() DO
Вверх
END
Насколько выразительно и отражающе существо дела. Не говоря про исключение набивающего так многим оскомину дублирования анализа условия.
Т.е. WHILE ELSIF END - такое же обобщение WHILE, как IF ELSIF END - обобщение IF (можно ведь описать всё и простым IF вообще без ELSE).
Резюме: эти фундаментальные структуры управления придуманы не от балды (в отличие от большинства артефактов современных языков). Они отражают важные аспекты реальности, реальных систем, алгоритмов как описания поведения этих систем. WHILE - простая обратная связь. Дейкстровский WHILE - обратная связь для случая с составными целями и неоднородными действиями по их достижению.
P.S. В функциональных абстракциях аналог обычного цикла - рекурсия, а аналог дейкстровского цикла - косвенная рекурсия. Кстати, наверняка многие случаи, настойчиво "просившие" рекурсии именно в силу неоднородности действий, выразятся отлично дейкстровским циклом.