Java
Как работает рекурсивная функция?
Как я понял - это что то похожее на бесконечный цикл for, который будет выполняться до тех пор, пока условие выхода из основной функции не станет истинным, если мы это условие пропишем. И почему так часто из за него переполняется стек, даже если скажем, мы сортируем массив рекурсией в 10 000 элементов? Ведь данные в стеке на эти 10к элементов по моим подсчетам не так уж много памяти должны занять, особенно, когда у многих нынче по 8-16 гигов оперативы. Или где там этот стек хранится, может, в кеше процессора? Ничего непонятно, разъясните пожалуйста поподробнее, как все это работает.
нет. это не бесконечный цикл...
переполненние бывает потому, что условие выхода из рекурсии определено неверно...
и ещё потому что в школе на математику клали постоянно, и потому прикинуть не могут масштаб вычислений...
но всё это -- теория..
чё к джаве прикапываться?
переполненние бывает потому, что условие выхода из рекурсии определено неверно...
и ещё потому что в школе на математику клали постоянно, и потому прикинуть не могут масштаб вычислений...
но всё это -- теория..
чё к джаве прикапываться?
Стек используется для вызова подпрограмм. В стек кладётся адрес возврата на который надо вернутся после вызова подпрограммы и передаваемые параметры. Подпрограмма также может использовать стек для своих локальных переменных. Держать локальные переменные в стеке подпрограмма может для поддержки рекурсии и многопоточности.
Размер стека варьируется от системы к системе и от языка к языку. Если язык поддерживает многопоточное программирование, то необходимо держать для каждого потока свой стек.
Java создает свой стек на каждый поток. По умолчанию в java размер стека 1M. Иногда его уменьшают до 512K. Накладные расходы на вызов метода это, как минимум, 8 байт на адрес возврата. Локальные переменные java также хранит в стеке. По передаваемым параметрам - Передача параметров в java реализовано только по значению, минимальный размер слота 4 байта.
Например, для передачи четырёх параметров boolean, int, int и массива потребуется
4 + 4 + 4 + 8 = 20 байтов (массив является объектом и, следовательно, передаётся копия его ссылки). Пусть в подпрограмме используется локальных переменных общим размером в 64 байта. Получим, в итоге, 8 + 20 + 64 = 92 байта на один вызов. Для 10000 рекурсивных вызовов это уже будет 920K.
Размер стека варьируется от системы к системе и от языка к языку. Если язык поддерживает многопоточное программирование, то необходимо держать для каждого потока свой стек.
Java создает свой стек на каждый поток. По умолчанию в java размер стека 1M. Иногда его уменьшают до 512K. Накладные расходы на вызов метода это, как минимум, 8 байт на адрес возврата. Локальные переменные java также хранит в стеке. По передаваемым параметрам - Передача параметров в java реализовано только по значению, минимальный размер слота 4 байта.
Например, для передачи четырёх параметров boolean, int, int и массива потребуется
4 + 4 + 4 + 8 = 20 байтов (массив является объектом и, следовательно, передаётся копия его ссылки). Пусть в подпрограмме используется локальных переменных общим размером в 64 байта. Получим, в итоге, 8 + 20 + 64 = 92 байта на один вызов. Для 10000 рекурсивных вызовов это уже будет 920K.
Похожие вопросы
- Что значит в данной строке "?" (какую функцию выполняет, зачем он там), за ранее спасибо!
- Где можно найти краткое обучение по использованию JFrame? Чтобы просто приводился порядок поставления и функций.
- Зачем нужны лямбда функции? И в частности в Котлине
- Массивы Прочитал несколько статей по массивам, но так и не понял, как они работают. Объясните вкратце и понятно, плз
- Вопрос для людей работающих в IT-сфере
- Калькулятор работает за счет Булевой логики. Вопрос -как? Как устроен алгоритм. Я не понимаю.
- Не работает запись русских символов в файл
- что за аргумент InputStreamReader у bufferedReader и зачем его использовать? без него работать не будет?
- Можно ли работать в яндексе программистом без диплома программиста?
- оператор if..else работает с логикой а оператор case с чем?