Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия, обратный отчет 
:(
    Опции темы
Rubio
Дата 1.9.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 8.8.2012

Репутация: нет
Всего: нет



Вообще что такое рекурсия понятно но непонятен один момент в примере из книги:

Код
#include <iostream>
using namespace std;

void func(int num);

int main ()
{
    func(5);
    system("pause");
    return 0;
}

void func(int num)
{
    cout << num << endl;
    if(num > 0)
        func(num - 1);
    cout << num << endl;
}


Вывод на консоль:
Код
5
4
3
2
1
0
0
1
2
3
4
5


Сначала значение переменно num доходит с 5 до 0  и тогда if принимает условие false и выполнячет следующая строка выводя 0, тут все ясно, но потом управление возвращается к вызывающей функции func(num - 1); и почему то начинает увеличиваться пока не доходит до 5 вот тут неясно ведь в случае возврата должен выполнять след оператор после функции, а именно cout << num << endl и выводить ноль?

Модератор: Не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 3.9.2012, 17:29
PM MAIL   Вверх
boostcoder
Дата 1.9.2012, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



рекурсивный вызов при завершении закручивания, должен раскрутить стек. это ты и видишь как обратный отсчет от 0 до 5.
стОит отметить, что, если аргумент передается в функцию по значению, то в стеке этой функции сохраняется это значение. таким образом, при рекурсивном вызове, при каждом завороте стека, стек "помнит" аргумент функции.

PM WWW   Вверх
Skevalt
Дата 1.9.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 30.11.2006

Репутация: нет
Всего: 3



А я ничего не понял:( Откуда там обратный отсчет?
код в liveworkspace
PM MAIL   Вверх
boostcoder
Дата 1.9.2012, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Skevalt @  1.9.2012,  16:20 Найти цитируемый пост)
ткуда там обратный отсчет?

думается мне, ТС попросту не тот код запостил.
при написании своего ответа, я был уверен что на самом деле его код такой:
Код

#include <iostream>
using namespace std;

void func(int num);

int main ()
{
    func(5);
    return 0;
}

void func(int num)
{
    if(num > 0) {
        cout << num << endl;
        func(num - 1);
    }
   cout << num << endl;
}

http://liveworkspace.org/code/26ee4ef6e036...6001c35c3397d6b

иначе чудо, однако  smile 

Это сообщение отредактировал(а) boostcoder - 1.9.2012, 16:28
PM WWW   Вверх
mes
Дата 1.9.2012, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(boostcoder @  1.9.2012,  15:24 Найти цитируемый пост)
думается мне, ТС попросту не тот код запостил.

по-моему тот..


Цитата(Skevalt @  1.9.2012,  15:20 Найти цитируемый пост)
А я ничего не понял:( Откуда там обратный отсчет?

два вывода, один до входа в рекусию, другой на выходе.. 



--------------------
PM MAIL WWW   Вверх
Rubio
Дата 1.9.2012, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 8.8.2012

Репутация: нет
Всего: нет



Код подправил, получается что этот от 0 до 5 это просто осталось в памяти переменных которые были до этого? но не совсем понятно почему тогда в других прогах с рекурсией типа фибоначи или факториалов нет таких закручиваний, там ведь тоже аргумент передаётся.
PM MAIL   Вверх
Skevalt
Дата 1.9.2012, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 30.11.2006

Репутация: нет
Всего: 3



Цитата(mes @  1.9.2012,  18:35 Найти цитируемый пост)
два вывода, один до входа в рекусию, другой на выходе.. 

Теперь код другой:) В исходном варианте вывод был только в одном месте, что вызвало мое смущение.


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.
PM MAIL   Вверх
boostcoder
Дата 2.9.2012, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  1.9.2012,  18:35 Найти цитируемый пост)
по-моему тот..

уже - да. потому что его изменили после моего последнего поста.

PM WWW   Вверх
loopz
Дата 3.9.2012, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.8.2012

Репутация: нет
Всего: нет



вопрос глупый но все таки --- я понял как идет отсчет от 5-0 это вложение с условием 14-17 строка потом идет печать просто нум то есть 0 ...но вот когда и как начинается отсчет наверх ??? конечно логично если учесть так называемую рекурсию то есть после каждого цикла  if  в Num заносится число предыдущее то есть перед 0 там будет 1 и в обратном порядку наверх но мне интересно почему он не замещает предыдущее значение в этом самом num  то есть почему после истинности условия if возникают все цифры что должны были вывестись num .....там же не массив а просто переменная ..или атм что стоит в очереди cout ??? ....много букв но надеюсь поймете что я имел в виду)

Это сообщение отредактировал(а) loopz - 3.9.2012, 08:24
PM MAIL   Вверх
xvr
Дата 3.9.2012, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(loopz @  3.9.2012,  08:13 Найти цитируемый пост)
там же не массив а просто переменная 

Там не просто переменная, там много переменных - по 1 штуке в каждом экземпляре вызова func(). Переменная num - локальная в func, поэтому когда происходит рекурсивный вызов func в той func, откуда звали, сама num не меняется

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.