| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Рекурсия, обратный отчет |
| Автор: Rubio 1.9.2012, 14:48 | ||||
Вообще что такое рекурсия понятно но непонятен один момент в примере из книги:
Вывод на консоль:
Сначала значение переменно num доходит с 5 до 0 и тогда if принимает условие false и выполнячет следующая строка выводя 0, тут все ясно, но потом управление возвращается к вызывающей функции func(num - 1); и почему то начинает увеличиваться пока не доходит до 5 вот тут неясно ведь в случае возврата должен выполнять след оператор после функции, а именно cout << num << endl и выводить ноль? Модератор: Не забываем пользоваться кнопочкой "Код" |
| Автор: boostcoder 1.9.2012, 16:12 |
| рекурсивный вызов при завершении закручивания, должен раскрутить стек. это ты и видишь как обратный отсчет от 0 до 5. стОит отметить, что, если аргумент передается в функцию по значению, то в стеке этой функции сохраняется это значение. таким образом, при рекурсивном вызове, при каждом завороте стека, стек "помнит" аргумент функции. |
| Автор: Skevalt 1.9.2012, 16:20 |
| А я ничего не понял:( Откуда там обратный отсчет? http://liveworkspace.org/code/42cc178da70d7fc8bfae7d74eb7ceebb |
| Автор: boostcoder 1.9.2012, 16:24 | ||
думается мне, ТС попросту не тот код запостил. при написании своего ответа, я был уверен что на самом деле его код такой:
http://liveworkspace.org/code/26ee4ef6e036cccc06001c35c3397d6b иначе чудо, однако |
| Автор: mes 1.9.2012, 18:35 |
по-моему тот.. два вывода, один до входа в рекусию, другой на выходе.. |
| Автор: Rubio 1.9.2012, 18:43 |
| Код подправил, получается что этот от 0 до 5 это просто осталось в памяти переменных которые были до этого? но не совсем понятно почему тогда в других прогах с рекурсией типа фибоначи или факториалов нет таких закручиваний, там ведь тоже аргумент передаётся. |
| Автор: Skevalt 1.9.2012, 18:57 |
Теперь код другой:) В исходном варианте вывод был только в одном месте, что вызвало мое смущение. 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 2.9.2012, 16:43 |
уже - да. потому что его изменили после моего последнего поста. |
| Автор: loopz 3.9.2012, 08:13 |
| вопрос глупый но все таки --- я понял как идет отсчет от 5-0 это вложение с условием 14-17 строка потом идет печать просто нум то есть 0 ...но вот когда и как начинается отсчет наверх ??? конечно логично если учесть так называемую рекурсию то есть после каждого цикла if в Num заносится число предыдущее то есть перед 0 там будет 1 и в обратном порядку наверх но мне интересно почему он не замещает предыдущее значение в этом самом num то есть почему после истинности условия if возникают все цифры что должны были вывестись num .....там же не массив а просто переменная ..или атм что стоит в очереди cout ??? ....много букв но надеюсь поймете что я имел в виду) |
| Автор: xvr 3.9.2012, 11:37 |
Там не просто переменная, там много переменных - по 1 штуке в каждом экземпляре вызова func(). Переменная num - локальная в func, поэтому когда происходит рекурсивный вызов func в той func, откуда звали, сама num не меняется |