Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Рекурсия, обратный отчет


Автор: Rubio 1.9.2012, 14:48
Вообще что такое рекурсия понятно но непонятен один момент в примере из книги:

Код
#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 и выводить ноль?

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

Автор: 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
Цитата(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/26ee4ef6e036cccc06001c35c3397d6b

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

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

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


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

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

Автор: Rubio 1.9.2012, 18:43
Код подправил, получается что этот от 0 до 5 это просто осталось в памяти переменных которые были до этого? но не совсем понятно почему тогда в других прогах с рекурсией типа фибоначи или факториалов нет таких закручиваний, там ведь тоже аргумент передаётся.

Автор: Skevalt 1.9.2012, 18:57
Цитата(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.

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

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

Автор: 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
Цитата(loopz @  3.9.2012,  08:13 Найти цитируемый пост)
там же не массив а просто переменная 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)