Вы возненавидите мой ответ, так как очень трудно преобразовать код из функционального языка в императивный, даже если он не кажется таким очевидным.
Есть две основные вещи, которые вы можете сделать:
Перепишите, чтобы удалить рекурсию. Это не всегда возможно и не легко. Иногда для этого есть алгоритм (единственный, который я могу придумать - это когда рекурсивная функция хвоста, но может быть и больше). В других случаях вы должны выполнить работу самостоятельно и написать пользовательскую функцию, которая выполняет те же функции, что и оригинал, но делает это без использования рекурсии.
Вы можете создать свою собственную систему, подобную стеку вызовов, для использования вместо стека вызовов, который использует язык. Это позволяет вам выполнять оптимизацию, которую выполняют функциональные языки, но не обязательно, это позволяет вам иметь стек для каждой функции, что снижает вероятность исчерпания стека, а также позволяет иметь стек размер вам нравится.
Конечно, вы можете комбинировать с этими двумя техниками столько, сколько захотите, поскольку в основном вам потребуется решение для каждой функции, используемой в сценарии.
Как я уже сказал, это не очень хорошие новости. Это довольно неприятные новости, поскольку это означает, что впереди еще много работы, если вы хотите перенести эту (или любую другую) функциональную библиотеку в императивный мир.