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