В том, что используются совершенно разные "охраняющие условия"... то есть, различные логические конструкции объединятся в одну только на том основании, что они выполнятся циклически. Разобраться и понять эту объединённую логику не всегда легко. Даже конечные автоматы с учётом множества состояний проще и понятнее писать без использования ЦД.
Возможно, это проблема неудобного синтаксиса.
Дело не синтаксисе... На любом языке ЦД остаётся ЦД.
Вот, например, хаскелл -- там нет циклов вообще и их имитировать приходится с помощью рекурсии.
Да, это т.н. "функциональный подход"... Не думаю, что отсутствие явных циклов - это правильно. Дело в том, что на языке программирования мы фактически записываем некую модель реальности. И чем ближе/точнее модель совпадает с реальностью, тем более адекватное описание получается. А в реальности многие процессы цикличны по своей сути. Циклически сменяются времена года, например. Но сказать, что зима вызывает весну?.. Это на любителя.
В результате часто получаются вполне нормальные функции, которые фактически являются реализацией цикла Дейкстры (с некоторым синтаксическим оверхедом на рекурсивный вызов).
Дело не в оверхеде... и не в рекурсии... дело в "охраняемых условиях". Логика у них разная...
Никаких проблем с такими логическими конструкциями нет совершенно, и, думаю, это благодаря более удобному синтаксическому оформлению кода (даже несмотря на тот оверхед)...
Это не имеет отношения к сути вопроса. С циклами тоже нет проблем... и от замены цикла на рекурсию (хотя для ЦД это допущение неверно!) ничего не меняется.
Почему неверно допущение...
Возьму определение ЦД
из Википедиииdo
P1 → S1,
Pn → Sn
od
Пусть функция, где выполняется этот ЦД называется LoopD, но в общем случае S1 <> S2 <> ... <> Sn <> LoopD. То есть, прямой рекурсии мы не получаем.