| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > вопрос о рекурсивных функциях |
| Автор: fedorizprostokvashino 16.1.2009, 12:11 | ||
Здрасти, вопросик мона задать
func - это рекурсивная функция или нет? |
| Автор: Lazin 16.1.2009, 12:20 |
| рекурсивная |
| Автор: pan2004 16.1.2009, 12:24 |
она вызывает саму себя(пусть даже и не во всех случаях), значит рекурсивная. |
| Автор: fedorizprostokvashino 16.1.2009, 12:30 |
| насколько я погимаю то в маём случае до конца выполнения программы будет создано 20 копий функций func и все они в момент выполнения программы будут висеть в оперативной памяти. А как бы переписать эту функцию чтоб предыдущая "умирала" а текущая работала, чтоб памяти сэкономить. |
| Автор: fedorizprostokvashino 16.1.2009, 12:34 |
| спасибо добрый человек разяснил |
| Автор: pan2004 16.1.2009, 12:36 | ||
а переписать можно так
|
| Автор: fedorizprostokvashino 16.1.2009, 12:41 | ||
канеш мона, просто я рекурсию плохо знаю. Привык код рекурсии видеть типа:
вот я и думаю в чем разница. Ну всмысле вызов самой себя ставят после слова return |
| Автор: pan2004 16.1.2009, 12:44 | ||
в данном случае в этом мало смысла, тк функция возвращает void, те ничего) |
| Автор: Lazin 16.1.2009, 12:45 | ||
это не так, ф-я только одна, но она вызывается 20 раз |
| Автор: mes 16.1.2009, 12:45 | ||||||||
также стек помещаются аргументы и локальные переменные - для каждой функции свои.
В принципе весь вопрос только в глубине вызовов . Если рекурсия непозволительна, то во многих случаях ее можно заменить циклом
например так :
или так :
|
| Автор: fedorizprostokvashino 16.1.2009, 12:56 |
| болшое спсб за разяснения. про цикл можно было и не говорить и так понятно что в этном случае его и надо использовать. просто я думаю что первый вызов func не завиршился, а значит перемменые в этой функции находятся в памяти, затем запускается вторая такая же функция (ее копия) но уже со своими значениями переменных (которые эстественно опять попадают в память) и тд (те 20раз). А после выполнения последнего раза память освобождается всеми этими переменными которые оброзовались. |
| Автор: mes 16.1.2009, 12:59 | ||||
ага, каждый раз стек забивается
не совсем так. Стек начинает раскручиваться в обратном порядке : Вначале освободится память занимаемая 20й функцией, потом 19 и так далее. |
| Автор: fedorizprostokvashino 16.1.2009, 13:01 |
| во терь мы поняли друг друга. мне просто принцип интересен и экономия от него. |
| Автор: mes 16.1.2009, 13:08 |
как следует из вышесказанного в рекурсии не желательно создавать большое кол-во локальных перемен, все что ненужно выносится за пределы функции (например в другие вспомогательные функции), тогда они не будут загромаждать стек. |
| Автор: fedorizprostokvashino 16.1.2009, 13:18 |
| ну и наверно можно (а может быть и нужно) использовать глобальные переменные |
| Автор: mes 16.1.2009, 13:20 | ||
|
| Автор: fedorizprostokvashino 16.1.2009, 13:24 |
| точно |