Есть еще третий вариант: обобщенные функции, работающие со списками (массивами). map f l
применяет функцию f к каждому элементу f и возвращает список результатов. filter p l
возвращает список элементов, для которых выполняется условие p. fold f l
«сворачивает» список, помещая функцию f между его элементами. Большинство циклов в имеративном коде можно свести к этим функциям. А если программист понял, как они работают, ему уже не надо отлаживать код глазами (что в случае цикла, что в случае рекурсии).
Надо только, чтобы язык поддерживал работу с функциями как со значениями. И анонимные функции не помешают (лябда-выражения по научному).