214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
|
1 | |
Рекурсия: как выделяется память под рекурсивный вызов?02.09.2011, 18:49. Показов 8160. Ответов 24
Метки нет (Все метки)
на картинке файлик из википедии в которой говорится что рекусия имеет вид дерева и некоторые ветви могут вычислятся по многу раз. А как это реализованно в с++? то же с повторениями?
И как выделяется память под рекусивный вызов? Например есть функция с набором локальных переменных - они будут жить до тех пор пока не завершится функция, т.е. так долго пока не будет выход из рекурсии? и мы будем иметь большое множество участков в памяти с одинакововой структурой данных(но разными значениями)?
0
|
02.09.2011, 18:49 | |
Ответы с готовыми решениями:
24
Как выделяется память под массив string? Объясните как выделяется память под умные указатели Как выделяется память под структуры? Не выделяется память под массив |
Заблокирован
|
|
02.09.2011, 18:54 | 2 |
в С++ можно очень быстро выйти из рекурсии выбросив исключение. Ну например при рекурсивном поиске, не будет цепочки ретурнов
0
|
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
|
02.09.2011, 18:56 [ТС] | 3 |
LosAngeles, а повторы есть? неужто не обошли это и рекурсия вызывает лавинообразный рост расчета одних и тех же значений?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
02.09.2011, 19:00 | 4 |
Дерево похоже на вычисление чисел Фибоначчи. Да повторы будут. Это хорошо видно вот в этой задаче про бесконечные последовательности.
1
|
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
|
|
02.09.2011, 19:00 | 6 |
В зависимости как эта рекурсия реализована. Например, если в реализации запоминается результат, то все на так уж лавинообразно.
1
|
Заблокирован
|
|
02.09.2011, 19:14 | 7 |
в общем случае нет никаких повторов, не понимаю о чём ты. Просто слишком велики издержки на вызов функций и в конце придётся кучу ретурнов пройти и если задача сводится к поиску чего-либо, то это как я говорил решается с помощью throw. Вообщем рекурсия медленее итераций и больше жрёт стека
Добавлено через 13 минут страуструп с тобой не согласен(последнее специальное издание), в стандарте нигде не указано, что исключения нужны только для ошибок и я не раз видел подобный метод в действии. Слово создателя языка и личный опыт для меня как то поавторитетнее будет. А goto использовать неполучится
1
|
Higher
|
|
02.09.2011, 19:18 | 8 |
Да, с goto погорячился, но генерация исключений не для ошибки - плохой стиль.
Ален Голуб, "Веревка достаточной длины, чтобы прострелить себе ногу" - начиная от 159 пункта.
1
|
Заблокирован
|
|
02.09.2011, 19:23 | 9 |
0
|
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
||||||
02.09.2011, 19:26 [ТС] | 10 | |||||
Сообщение было отмечено как решение
Решение
LosAngeles, да видимо по сути своей она так организована что повторяется в вычислениях если их не сохранить как в примерах выше.
вопрос
0
|
diagon
|
02.09.2011, 19:27
#11
|
Не по теме: А можно узнать соответствующий параграф в справочнике? =\ Просто мне кажется, что там написано, что исключения могут быть использованы в нестандартных ситуациях, т.е. что язык это позволяет, но что он рекомендует использовать подобное - не верю. P.S. цепочка return еще и эффективнее должна быть.
0
|
Заблокирован
|
|
02.09.2011, 19:36 | 12 |
14.1.1 страница 410
Добавлено через 1 минуту и 14.5 страница 427 Добавлено через 2 минуты вот именно в ней и говорится что исключения стоит применять в глубоко рекурсивных функциях поиска, например по дереву. Цитирую: "элегантный способ"
0
|
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
|
02.09.2011, 19:37 [ТС] | 13 |
хорошо, как подняться с большой глубины рекурсии минуя цепь return?
кроме throw
0
|
02.09.2011, 19:39 | 14 |
Вообще все зависит от задачи и от реализации. Если рекурсия для линейных структур, то вполне можно без повторений обойтись. Если рекуррентное соотношение предполагает повторения, то лучше без нее (рекурсии) обойтись.
0
|
Заблокирован
|
|
02.09.2011, 19:39 | 15 |
никак
0
|
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
|
02.09.2011, 19:45 [ТС] | 17 |
Thinker, вот в чем дело. подозреваю что из за повторных вычислений я получаю на выходе некое неверное значение. тот пример что я привел - постарался выразить некие опасения, есть в таком варианте повторы или нет? рекурсия в цикле. И вообще мож это в корне неверно мешать одно с другим? В том примере выход из рекурсии - когда вектор пуст. После этого начнутся return
Добавлено через 1 минуту т.е просто по цепочке вверх пойдет, верно? последовательно вверх. А как это все лежит в памяти, что с автопеременными, когда я ушел вглубь из функции?
0
|
Заблокирован
|
|
02.09.2011, 19:47 | 18 |
от старших адресов к младшим. Чем глубже тем младше адрес, это же стек
1
|
02.09.2011, 19:49 | 19 |
Это (повторы) на результат никак не влияет. Все зависит от правильности организации алгоритма.
В рекурсии может присутствовать сколько угодно циклов. Пойдет вверх. Также, как и обычная загрузка функции в стек.
1
|
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
|
02.09.2011, 19:49 [ТС] | 20 |
LosAngeles, логично и автопеременные живут каким то образом. получается динамическое заполнение стэка? Для каждого вызова в глубь новый адрес под тело?
0
|
02.09.2011, 19:49 | |
02.09.2011, 19:49 | |
Помогаю со студенческими работами здесь
20
Где выделяется память под массив Где выделяется память под объекты Почему не выделяется память под двумерный массив? Когда выделяется память под переменные - во время объявления или инициализации Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |