|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.05.2013, 16:07 | #1 |
Форумчанин
Регистрация: 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 а ДАЛЬШЕ что консоль выводит и почему столько много чисел я не понял объясните пожалуйста |
01.05.2013, 17:11 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Когда а==20 рекурсия прерывается. Происходит каскадный (так сказать) выход из всех процедур, которые были до него вызваны. Т.е. 4 раза процедура выполнится, но каждое выполнение как-бы будет ждать пока наступит условие выхода.
Представь себе строй, который сержант пересчитывает - каждый следующий отзывается, но перекличка закончится только на последнем и строй может разойтись только в этом случае. Причем расходятся по очереди начиная с последнего. Так и тут - самый первый вызов gg(); будет ждать пока все остальные отработают, и только потом выйдет сам.
I'm learning to live...
|
01.05.2013, 18:11 | #3 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
ТС надо посмотреть что вобще происходит при вызове функции и при возврате из нее (даже не рекурсивной функции, а функции вообще). Там что-то делается с регистром программного счетчика, который после возврата из функции восстановит свое значение, это значит что если та написал Код:
Вот так и в твоем случае: Код:
|
|
01.05.2013, 18:12 | #4 | |||
Форумчанин
Регистрация: 03.04.2013
Сообщений: 167
|
стековая организация - последний пришел, первый вышел
все равно логика у меня теряется вот что выводит консоль - Цитата:
рекурсивный вызов gg(a+1,b-1); Цитата:
Цитата:
Последний раз редактировалось Stilet; 01.05.2013 в 18:30. |
|||
01.05.2013, 18:29 | #5 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Нопасаранчег. Цитата:
I'm learning to live...
|
||
01.05.2013, 18:32 | #6 |
Форумчанин
Регистрация: 03.04.2013
Сообщений: 167
|
в кернигане есть код быстрой сортировки(Ч.А.Р. Хоар) и я не могу его разобрать что там и как в нем происходит
тема Рекурсия. там вызов функции в ней двойной вызов этой же функции и еще в if есть return и я попробовал написать похожий код только попроще...все равно не понял что происходит после того как в return попал.Еще сильней запутался) с помощью f10 и точки останова в функции все равно не могу до конца разобраться - все равно нить логики у меня теряется после попадания в return что возвращается и что потом вызывается я не могу понять |
01.05.2013, 18:39 | #7 |
Форумчанин
Регистрация: 03.04.2013
Сообщений: 167
|
Код:
qsort(v,left,last-1); qsort(v,last+1,right); и этот двойной вызов мне уже снится |
01.05.2013, 19:07 | #8 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А-а-а кажись понял. По-моему там массив делится пополам. Каждые половинки сортируются отдельно, опять таки делясь пополам пока делить есть что. Прям таки как твои клетки делятся.
I'm learning to live...
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рекурсия (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 |