Ну, я видел тонны ответов и даже принял ответ, но никогда не видел правильного, и думал, почему ...
Короче говоря:
Всегда избегайте рекурсий, если вы можете сделать ту же самую единицу, которая будет производиться петлями!
Как работает рекурсия?
• Кадр в стековой памяти выделяется для одного вызова функции
• Кадр содержит ссылку на фактический метод
• Если у метода есть объекты, объекты помещаются в память кучи, а кадр будет содержать ссылку на эти объекты в памяти кучи.
• Эти шаги выполняются для каждого вызова метода!
Риски:
• StackOverFlow, когда в стеке нет памяти для размещения новых рекурсивных методов.
• OutOfMemory, когда у кучи нет памяти для размещения рекурсивных хранимых объектов.
Как работает цикл?
• Все предыдущие шаги, за исключением того, что повторное выполнение кода внутри цикла не будет потреблять никаких дополнительных данных, если они уже использованы.
Риски:
• Единственный риск внутри цикла, когда ваше состояние просто никогда не будет существовать ...
Ну, это не вызовет никаких сбоев или чего-либо еще, это просто не выйдет из цикла, если вы наивно делаете while(true)
:)
Тест:
Сделайте следующее в вашем программном обеспечении:
private Integer someFunction(){
return someFunction();
}
Вы получите StackOverFlow
исключение в секунду и, возможно, OutOfMemory
тоже
сделать второй:
while(true){
}
Программное обеспечение просто зависнет, и сбой не произойдет:
Последнее, но не менее важное - for
петли:
Всегда используйте циклы for
, потому что тот или иной путь этого цикла несколько заставляет вас задавать точку разрыва, после которой цикл не пойдет, конечно, вы можете быть очень злым и просто найти способ сделать for
цикл никогда не останавливается, но я советую вам всегда использовать циклы вместо рекурсии в целях управления памятью и повышения производительности вашего программного обеспечения, что в наши дни является огромной проблемой.
Ссылка:
Распределение памяти на основе стека