Например числа фибоначи можно считать с помошью цикла в С++ или питоне. А что делать, если циклов нет? Можно считать рекурсией. А когда считаем рекурсией, то можно запоминать вызовы с определенными аргументами и результаты их выполнения, чтобы не вычислять повторно одно и тоже. Однако я как программист понимаю, что для вычисления n-го числа требуется вычисление всех предыдущих, так что я могу использовать мемоизацию. То есть я могу определить список, в котором будут хранится числа фибоначи и как их считать. Вычисления можно упорядочить задав между ними зависимости, а если нас интересует только конечный результат, то значит премежуточные значения нам не интересны. Вот так и получается, что в функциональном языке я говорю, что считаю последовательность, потом беру n-й ее член, а все остально мне не нужно и тогда компилятор это скомпилит правильно, а оптимизации превратят это во что-то вроде цикла.