Глубина рекурсивного стека вызовов
У меня есть рекурсивная функция, которая работает для ввода, где глубина стека вызовов до 1000, но не работает для больших входов. Я преобразовал функцию в хвостовую рекурсию, и это позволило ей достичь 1350.
Каковы пределы и есть ли способ увеличить этот предел?
Я работаю с чистыми функциями и хотел бы избежать использования операций. У меня есть решение, которое разбивает проблему на несколько этапов, каждый из которых имеет меньшую глубину стека, но он довольно изобретателен, поскольку его единственная цель - избежать проблемы и сделать ее более сложной.
4 ответа
Это опять моя ошибка... настройка для стека Java - -Xss (настройка -Xms - это начальный размер кучи), извините. Так что, если вы используете раздел "Аргументы JVM" на вкладке "Отладчик" панели запуска и устанавливаете что-то вроде -Xss5m, вам нужно идти дальше.
В простом эксперименте с рекурсивной функцией стек по умолчанию дал мне глубину 227 вызовов. Использование -Xss5m дало мне 4020 вызовов, а -Xss10m - 8050. Обратите внимание, что эти размеры стека несколько меньше, чем размеры Gb, которые вы пробовали - 5Mb стека - это много вызовов!
Увертюра не накладывает ограничение стека сверх базового предела стека Java, поэтому она просто учитывает аргумент -Xms JVM. Я думаю, что обычный стек выполнения для интерпретатора происходит из файла Overture.ini (верхний уровень), где вы видите аргумент -Xmx для установки максимальной кучи. Можете ли вы попробовать добавить (скажем) -Xms128m, или размер по вашему выбору, и посмотреть, будет ли это дальше?
Похоже, вы спрашиваете, как увеличить ограничение стека Java в отладчике Overture, а не в IDE Overture (overture.ini).
Чтобы изменить передачу дополнительных аргументов отладчику Overture, необходимо добавить их в конфигурацию запуска:
- Откройте конфигурацию запуска
- Выберите вкладку "Отладчик"
- Добавьте ваши аргументы в поле, отображаемое рядом с "Аргументы:" в верхней части
Я пробовал с -Xms и -Xmx, настроенными на 2048 м, но без какого-либо влияния. Я также попробовал Overture 2.3.0 на Mac OSX и Windows 10 с тем же результатом.
Чтобы вывести мой проект из цикла, я создал новый проект с одной очень простой функцией:
countdown(n:nat) res:nat
== if n=0 then n else countdown(n-1)
Как на Windows, так и на Mac я могу назвать это со значением 807 и быть успешным, в то время как с 808 это завершится ошибкой:
internal error
Main 206: Error evaluating code
Detailed Message: internal error