Как отличить бесконечный цикл от очень длинного?
В общем случае - никак.

Но вы можете каким-то образом выводить прогресс вычислений в реальном времени. Например, сколько процентов вычислений уже выполнено. Тогда баги будет проще заметить.

Либо можно выводить, как один этап сменяет другой (при условии, что в новом витке будет что-то новое и будет виден прогресс). Например, чтение 1000 файлов может сопровождаться выводом имени файла. И таким образом видно, что прога переходит от одного файла к другому, а не застряла где-то.

Но гарантии, естественно, нет. Даже так может зациклиться бесконечно. Просто это будет проще обнаружить - зависание прогресса, повторение этапов, непонятные скачки прогресса и т.д.
Это классическая задача останова. Она не решается алгоритмически. Поэтому вы никогда не узнаете ответа, пока не проверите каждый конкретный случай.

Перестройте свой алгоритм, чтобы он перестал иметь теоретическую возможность бесконечного выполнения. Для этого, в первую очередь, избавьтесь от рекурсии.