Глубина рекурсивного стека вызовов

У меня есть рекурсивная функция, которая работает для ввода, где глубина стека вызовов до 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, необходимо добавить их в конфигурацию запуска:

  1. Откройте конфигурацию запуска
  2. Выберите вкладку "Отладчик"
  3. Добавьте ваши аргументы в поле, отображаемое рядом с "Аргументы:" в верхней части

Конфигурация старта увертюры

Я пробовал с -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
Другие вопросы по тегам