![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Rubio |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.8.2012 Репутация: нет Всего: нет |
Вообще что такое рекурсия понятно но непонятен один момент в примере из книги:
Вывод на консоль:
Сначала значение переменно num доходит с 5 до 0 и тогда if принимает условие false и выполнячет следующая строка выводя 0, тут все ясно, но потом управление возвращается к вызывающей функции func(num - 1); и почему то начинает увеличиваться пока не доходит до 5 вот тут неясно ведь в случае возврата должен выполнять след оператор после функции, а именно cout << num << endl и выводить ноль? Модератор: Не забываем пользоваться кнопочкой "Код" Это сообщение отредактировал(а) bsa - 3.9.2012, 17:29 |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
рекурсивный вызов при завершении закручивания, должен раскрутить стек. это ты и видишь как обратный отсчет от 0 до 5.
стОит отметить, что, если аргумент передается в функцию по значению, то в стеке этой функции сохраняется это значение. таким образом, при рекурсивном вызове, при каждом завороте стека, стек "помнит" аргумент функции. |
|||
|
||||
Skevalt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
думается мне, ТС попросту не тот код запостил. при написании своего ответа, я был уверен что на самом деле его код такой:
http://liveworkspace.org/code/26ee4ef6e036...6001c35c3397d6b иначе чудо, однако ![]() Это сообщение отредактировал(а) boostcoder - 1.9.2012, 16:28 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
по-моему тот.. два вывода, один до входа в рекусию, другой на выходе.. |
|||
|
||||
Rubio |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.8.2012 Репутация: нет Всего: нет |
Код подправил, получается что этот от 0 до 5 это просто осталось в памяти переменных которые были до этого? но не совсем понятно почему тогда в других прогах с рекурсией типа фибоначи или факториалов нет таких закручиваний, там ведь тоже аргумент передаётся.
|
|||
|
||||
Skevalt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
Теперь код другой:) В исходном варианте вывод был только в одном месте, что вызвало мое смущение. Rubio, распиши вход и выход из каждой функции в виде лесенки и станет понятнее: f0: print num = 5 f1: print num = 4 f2: print num = 3 f3: print num = 2 f4: print num = 1 f5: print num = 0 print num = 0 print num = 1 print num = 2 print num = 3 print num = 4 print num = 5 end где f0-f5 уровень вложенности функции, которая печатает num, по условию вызывает вложенный уровень, печатает num. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
уже - да. потому что его изменили после моего последнего поста. |
|||
|
||||
loopz |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
вопрос глупый но все таки --- я понял как идет отсчет от 5-0 это вложение с условием 14-17 строка потом идет печать просто нум то есть 0 ...но вот когда и как начинается отсчет наверх ??? конечно логично если учесть так называемую рекурсию то есть после каждого цикла if в Num заносится число предыдущее то есть перед 0 там будет 1 и в обратном порядку наверх но мне интересно почему он не замещает предыдущее значение в этом самом num то есть почему после истинности условия if возникают все цифры что должны были вывестись num .....там же не массив а просто переменная ..или атм что стоит в очереди cout ??? ....много букв но надеюсь поймете что я имел в виду)
Это сообщение отредактировал(а) loopz - 3.9.2012, 08:24 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |