Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2010, 20:17   #1
Zedx
Новичок
Джуниор
 
Регистрация: 25.09.2010
Сообщений: 5
По умолчанию Рекурсивная ф-ция (обьяснить)

Проходил тест и встретил такой вопрос. Решил разобратся но так и не могу понять принципа, не мог-бы кто-нибудь объяснить? (блок-схемы будет достаточно).

#include <iostream.h>

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

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

PS результатом будет: 012345.
Zedx вне форума Ответить с цитированием
Старый 25.09.2010, 22:27   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,726
По умолчанию

Цитата:
Решил разобратся но так и не могу понять принципа, не мог-бы кто-нибудь объяснить?
Как пытались? На бумажке шаги рисовали? Или только слова?
p51x вне форума Ответить с цитированием
Старый 25.09.2010, 22:34   #3
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Что именно не понятно? Функция будет вызывать сама себя пока num не станет равен 0. Затем после каждого возврата будет выводиться цифра. Потому и выводится в обратном порядке. Если вывод сделать перед рекурсивным вызовом
Код:
#include <iostream.h>

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

int main(void)
{
func(5);
return 0;
}
то результатом будет 543210 потому что сначала выводится, а потом рекурсивно вызывается.

P.S. немного очепятался. Короче, ответ будет в обратном порядке
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 26.09.2010 в 10:54.
alexcoder вне форума Ответить с цитированием
Старый 25.09.2010, 22:38   #4
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от alexcoder Посмотреть сообщение
то результатом будет 012345 потому что сначала выводится, а потом рекурсивно вызывается.
Эээээ.. Я конечно с си не знаком, но что-то мне подсказывает что результатом будет 543210
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 25.09.2010, 22:53   #5
Zedx
Новичок
Джуниор
 
Регистрация: 25.09.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Как пытались? На бумажке шаги рисовали? Или только слова?
Ну на бумажке не рисовал, но сидел и всматривался в нее 3 часа))

2alexcoder

void func(int num)
тут подётся 5

по том идет проверка if ( num != 0 )

потом она опять вызывается? только уже с num-1 (т.е. с 4?)

или она становится 4, выводится (cout << num) и аж потом вызывается с num-1? но тогда все-равно будет вывод "54321".

Цитата:
Сообщение от Tronix Посмотреть сообщение
Эээээ.. Я конечно с си не знаком, но что-то мне подсказывает что результатом будет 543210
Это меня и путает.
Zedx вне форума Ответить с цитированием
Старый 26.09.2010, 00:22   #6
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Допустим 5

Сначала идет вызов функции со значением 4 (5-1)
Затем идет вывод 5 на экран.

Что тут понимать то? вывод и получается

012345. Потому как сначала через вызовы добирается до 0 выводит сначала его а потом уже раскручивается обратно по возрастанию.
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 26.09.2010, 00:46   #7
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Постараюсь пояснить развернуто.
2 Zedx - все достаточно просто - поясняю на твоем примере.
Вот представь, что у тебя func(1).
1) получается, что внутри func(1) вызывается func(0) - которая печатает 0
2) ну сама функция func(1) - не завершила же свою работу (важно для понимания) она печатает далее свой num - т.е. 1. Т.е. func(0) отработала и потом func(1) далее продолжила свою работу - напечатав 1
Итак со всеми числами.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 26.09.2010 в 00:48.
Roof вне форума Ответить с цитированием
Старый 26.09.2010, 02:27   #8
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

Тут лучше всего будет дебаггером вмазаться
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 26.09.2010, 02:37   #9
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от Roof Посмотреть сообщение
Постараюсь пояснить развернуто.
2 Zedx - все достаточно просто - поясняю на твоем примере.
Вот представь, что у тебя func(1).
1) получается, что внутри func(1) вызывается func(0) - которая печатает 0
2) ну сама функция func(1) - не завершила же свою работу (важно для понимания) она печатает далее свой num - т.е. 1. Т.е. func(0) отработала и потом func(1) далее продолжила свою работу - напечатав 1
Итак со всеми числами.
Вот именно это я и пытался сказать =)
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 26.09.2010, 22:21   #10
Zedx
Новичок
Джуниор
 
Регистрация: 25.09.2010
Сообщений: 5
По умолчанию

2 Roof
Спасибо за подробное объяснение
Как я понял, я раньше и не догадывался о времени выполнения)
т.е. когда стартует
func(5)
после нее идет проверка if ( != 0)
и получается ПАРАЛЕЛЬНО вызывается еще одна функция func (4)
а func(5) - находится в процессе выполнения.
потом опять идет проверка ИФа, вызывается func(3)
соответственно func(5) и func(4) находятся в процессе выполнения.
и так до нуля. А потом уже идет ДОвыполнение.
на func(0) проверяется условие, оно соответственно false и выполняется cout с фу-ции func(0) затем довыполняется func(1)...func(5) (их cout-ы).
Я все правильно понял?)
Zedx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная функция в С++ Ahellen Помощь студентам 7 20.09.2010 20:58
Обьяснить код. Дядя Тёма Фриланс 1 09.06.2010 20:18
Нужна ф-ция GetModuleBase или пoмогите переписать ее с c++ на Delphi. kalexi Win Api 0 03.02.2010 00:22
Фильтрующая ф-ция для мышки |{ot Win Api 0 13.11.2009 02:54