В основном, это удобство.

Обычно любую рекурсивную программу можно развернуть в цикл, но в этом случае часто может потребоваться хранилище для промежуточных результатов вычисления. В случае с факториалом промежуточное значение вмещается в одну переменную, но, например, для построения алгоритма закраски области (flood fill) вам потребуется список или очередь с координатами необработанных пикселей, и у этого списка будет динамический размер.

Во многих языках, динамически создаваемый объект или массив переменного размера требует выделения блока памяти из "кучи"(heap), что может работать относительно медленно.

В случае использования рекурсии же, аргументы передаются через стек, и выделение стековой памяти происходит очень быстро - просто изменением значения регистра. Конечно, до тех пор, пока стек не переполнится.
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence