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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2013, 16:07   #1
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию Рекурсия


#include<stdio.h>
void gg(int a,int b)
{ int i=0;
if(a==20)
return;
printf("%d\n",a);
printf("%d\n",b);
gg(a+1,b-1);
gg(a+1,b);
}
void main()
{
gg(16,10);

}


Объясните пожалуйста что делает return ,когда if true что куда возвращается и что потом вызывается - я запутался
до return все понятно - рекурсивный вызов gg(a+1,b-1); до тех пор пока a!=20
т.е. передаем функции gg: 16 и 10 - консоль выводит 17 и 9 ; 18 и 8; 19 и 7 а ДАЛЬШЕ что консоль выводит и почему столько много чисел я не понял
объясните пожалуйста
alekopoko вне форума Ответить с цитированием
Старый 01.05.2013, 17:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Когда а==20 рекурсия прерывается. Происходит каскадный (так сказать) выход из всех процедур, которые были до него вызваны. Т.е. 4 раза процедура выполнится, но каждое выполнение как-бы будет ждать пока наступит условие выхода.
Представь себе строй, который сержант пересчитывает - каждый следующий отзывается, но перекличка закончится только на последнем и строй может разойтись только в этом случае. Причем расходятся по очереди начиная с последнего.
Так и тут - самый первый вызов gg(); будет ждать пока все остальные отработают, и только потом выйдет сам.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2013, 18:11   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Представь себе строй, который сержант пересчитывает - каждый следующий отзывается, но перекличка закончится только на последнем и строй может разойтись только в этом случае. Причем расходятся по очереди начиная с последнего.
Так и тут - самый первый вызов gg(); будет ждать пока все остальные отработают, и только потом выйдет сам.
незнаю что у тебя в голове, но пример адский xD

ТС надо посмотреть что вобще происходит при вызове функции и при возврате из нее (даже не рекурсивной функции, а функции вообще). Там что-то делается с регистром программного счетчика, который после возврата из функции восстановит свое значение, это значит что если та написал
Код:
А
f()
B
то выполняется выражение А, потом вызов функции, а после этого управление передается команде B.

Вот так и в твоем случае:
Код:
printf("%d\n",b);
gg(a+1,b-1);
gg(a+1,b);
после того, как отработает первая функция вызывается вторая, и обе они рекурсивные, поэтому так много цифр.
rrrFer вне форума Ответить с цитированием
Старый 01.05.2013, 18:12   #4
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

стековая организация - последний пришел, первый вышел
все равно логика у меня теряется
вот что выводит консоль -
Цитата:
16
10
17
9
18
8
19
7
19
8
18
9
19
8
19
9
17
10
18
9
19
8
19
9
18
10
19
9
19 - последний вызов gg(a+1,b)
10 - последний вызов gg(a+1,b)
это же последний вызов,почему он вышел не первым а последнем,почему не по принципу стека - "последним пришел - первым вышел"

рекурсивный вызов gg(a+1,b-1);
Цитата:

16
10
17
9
18
8
19
7
потом должен идти рекурсивный вызов gg(a+1,b);
Цитата:
17
10
18
10
19
10
но консоль вывела больше значений...намного больше

Последний раз редактировалось Stilet; 01.05.2013 в 18:30.
alekopoko вне форума Ответить с цитированием
Старый 01.05.2013, 18:29   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
незнаю что у тебя в голове, но пример адский xD
Спокуха, все тараканы на своих постах ))
Нопасаранчег.
Цитата:
alekopoko
Давай ка задачу в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2013, 18:32   #6
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

в кернигане есть код быстрой сортировки(Ч.А.Р. Хоар) и я не могу его разобрать что там и как в нем происходит
тема Рекурсия.
там вызов функции в ней двойной вызов этой же функции и еще в if есть return
и я попробовал написать похожий код только попроще...все равно не понял что происходит после того как в return попал.Еще сильней запутался)

с помощью f10 и точки останова в функции все равно не могу до конца разобраться - все равно нить логики у меня теряется после попадания в return
что возвращается и что потом вызывается я не могу понять
alekopoko вне форума Ответить с цитированием
Старый 01.05.2013, 18:39   #7
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

Код:
#include<stdio.h>
void swap(int v[],int i,int j);
void qsort(int v[],int left,int right)
{
	int i,last;
	if(left>=right)
		return;
	swap(v,left,(left+right)/2);
	last=left;
	for(i=left+1;i<=right;i++)
		if(v[i]<v[left])
			swap(v,++last,i);
	swap(v,left,last);
	qsort(v,left,last-1);
	qsort(v,last+1,right);
}
void swap(int v[],int i,int j)
{
	int temp;
	temp=v[i];
	v[i]=v[j];
	v[j]=temp;
}
void main()
{
	int a[13]={34,52,18,35,21,16,11,22,45,3,67,8,1};
	qsort(a,0,12);
	for(int i=0;i<=12;i++)
	printf("%d ,",a[i]);
}
после return я понимаю что в си я идиот
qsort(v,left,last-1);
qsort(v,last+1,right);
и этот двойной вызов мне уже снится
alekopoko вне форума Ответить с цитированием
Старый 01.05.2013, 19:07   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а кажись понял. По-моему там массив делится пополам. Каждые половинки сортируются отдельно, опять таки делясь пополам пока делить есть что. Прям таки как твои клетки делятся.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия (C++) RAVAL(c) Помощь студентам 4 26.12.2011 01:18
Рекурсия (С) rublyabachka Помощь студентам 1 15.12.2011 02:11
Рекурсия mishanya6 Помощь студентам 1 08.12.2011 12:17
Рекурсия Alexsey1991 Помощь студентам 1 12.05.2010 10:24