Я хотел бы знать, существует ли фундаментальная причина ограничения глубины рекурсии в F # до 10000 или около того, и в идеале, как избежать этого предела. Я думаю, что вполне разумно писать код, который использует пространство стека O (n), и был бы признателен, если кто-то, кто не согласен, может объяснить, почему они это делают. Большое спасибо. Я объясняю свое мышление ниже.
Я не вижу, что есть какая-то причина не позволять стеку расти до тех пор, пока вся доступная память не будет исчерпана. Это означало бы, что бесконечная рекурсия займет больше времени, но это не так, как будто мы не можем писать программы, которые потребляют бесконечное количество памяти. Я знаю, что можно сократить использование стека до O (1) с использованием продолжений и хвостовой рекурсии, но я не особо вижу, как мне хорошо делать это все время. Я также не вижу, как это помогает знать, когда функция, вероятно, потребуется обработать "большой" вход (ну, по стандарту 8-битного микроконтроллера).
Я думаю, что это принципиально отличается от того, чтобы, например, используйте накопительные параметры, чтобы избежать квадратичного поведения времени. Хотя это также вызывает беспокойство по поводу деталей реализации и не нужно делать для "малых" входов, это также очень отличается от того, что компилятор не может тривиально удалить проблему самостоятельно. Кроме того, он отличается тем, что немного сложный O (n) код, который был бы O (n ^ 2), если он наивно очень полезен, чем простая, медленная, легко читаемая версия. Напротив, код стиля продолжения имеет точно такую же сложность памяти, что и соответствующая наивная версия, но просто использует различный вид памяти. Это то, о чем компилятор не должен беспокоить меня в этот день и возраст?
В то время как я бы предпочел теоретическую причину того, почему невозможно иметь глубокий стек, мы могли бы также обсудить практические аспекты. Мне кажется, что стек представляет собой несколько более эффективный способ управления памятью, чем куча, поскольку он не требует сбора мусора и легко освобождается? Я не уверен, что могу даже увидеть, что есть затраты на создание глубоких стеков. По общему признанию, ОС необходимо выделить достаточно виртуального пространства, чтобы содержать всю память, которую вы могли бы использовать сразу во всей программе для каждого стека потоков. Но так что. Это не так, как если бы мы, скорее всего, исчерпали нынешний общий 48-битный лимит, или производители оборудования не могут тривиально увеличить этот предел до 64 бит?
Здесь нет особого значения для F #. Я ожидаю, что такое же ограничение применимо и к С#, и не увидит, что он там больше необходим, хотя на практике при программировании в императивном стиле явно намного меньше.
Большое спасибо за любые ответы/комментарии.
EDIT: я написал краткое изложение ответов ниже.