![]() |
|
Модераторы: bsa |
![]()
|
|
| Killer_13 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 12.1.2008 Где: Germany Репутация: 1 Всего: 1 |
Здравствуйте, давно я не задавал глупых вопросов, решил опять начать.
Значит, - началась моя подготовка к экзамену по программированию "С", готовлюсь тщательно, так как хочу сдать на хорошую оценку, разбираю все что необходимо. Решил полностью разобраться с рекурсией, вот уже пол дня прошел, пока кажеться чуток протоптал, но если в общем, то почти на месте топчусь, перечитал множество примеров и литературы, решил еще и здесь спросить, может че кто подскажет. Значит, возьмем самый простой пример рекурсии, - возведение в степень. Уже раз 20 с помощью дебаггера исследовал принцип работы задачи не могу до конца понять.
Значит.. попробую обьяснить, что именно мне не понятно. 1.Передали мы в ф-цию два значения,(к примеру 3 и3), иф проработал пока ехр не стала нуль вышол на ретурн 1 и аж потом начал переменной р присваивать9, и 27. так вот, почему ретурн 1 повернул это все таким образом? насколько я понимаю если решается с помощью рекурсии, то все заганяется в стэк, а потом он начинает высвобождаться. Теоретически понимаю, но вот на программном уровне не очень. 2. вот например как мы можем умножать значение base*power(base,exp-1) если в ф-ции значение base не меняется, а значение ехр меняется, как именно происходит умножение числа на ф-цию с двумя параметрами. думаю если кто в 2ух словах напишет, картина станет четче. Пасибо! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| Killer_13 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 12.1.2008 Где: Germany Репутация: 1 Всего: 1 |
Чуток яснее стало
Я чуток попробовал подправить
почему р постоянно выдает -1. Но вот еще понять не могу, как ретурн1 заставляет прыгнуть вот сюда
и напечатать три раза р? :( |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
есть функция допустим
когда рекурсивно последний вызов функции завершится (i = 0), то мы возвратимся к строчке fcn(--i); и программа начнёт выполняться со следующей строки. ещё понятней стало? |
|||
|
||||
| Killer_13 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 12.1.2008 Где: Germany Репутация: 1 Всего: 1 |
Понятней, а сколько раз р печатать? Она печатает пока не освободится стек или...?
вот - из вашего рисунка понятно, что умножаться начинает с последнего элемента, тоисть с 2*(2,0) - откуда там взялась 1? И все так не понял как ретурн 1 прыгает в принтф и заставляет р печататься, а откуда тогда р берет значения, если мы работаем со строкой которая ниже строки которая определяет значение р? А почему именно умножается второе значение функции? тоисть 2*(2,0) 0 заменяется на 1 откуда? |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Killer_13, слишком много вопросов
возьмите пример попроще на рекурсию. например факториал. или число Фибоначчи. http://ru.wikipedia.org/wiki/Рекурсия
Это сообщение отредактировал(а) zim22 - 17.6.2009, 21:41 |
|||
|
||||
| Killer_13 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 12.1.2008 Где: Germany Репутация: 1 Всего: 1 |
разбирал я все єти примеры, че т результат один.. :(
да вот сюда и обратился с надеждой услышать ответы на свои вопросы, хочется четко понять как работает. |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
В раазвернутом коде выглядит так :
или в текстовом виде
Это сообщение отредактировал(а) mes - 18.6.2009, 11:54 |
||||||||
|
|||||||||
| Killer_13 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 12.1.2008 Где: Germany Репутация: 1 Всего: 1 |
Почти все понятно, но хочу задать еще несколько вопросов. :_
например если вот например, в предыдущем примере.
если эту ф-цию вызывать в мейн програм, то нужно задать какое то стартовое значение. Например repeat(3);
1.а зачем последняя строчка repeat(5) - что она делает, если я задал уже значение? а вот почему в дебаггере, переменная о обьявляется и ей присваивается какое то произвольное число, а после прохождения строчки она становиться значением 23, а потом снова наново... 2.Я хочу спросить, почему в начале переменной о присваивается какое нибудь значение? |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
переменная о локальная, и для каждого вызова функции создается новый экземпляр. Итого при при repeat (5) в Вашем случае создается 6 экземпляров о (при n=5,4,3,2,1,0) вот попробуйте поэксперементировать с этим примером :
он на консоль будет выводить, что происходит внутри. надеюсь что такое структура и с передачей по ссылке Вы знакомы. |
||||
|
|||||
| Killer_13 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 12.1.2008 Где: Germany Репутация: 1 Всего: 1 |
Пасибо, за последний пример, но он на С++ - вижу, что легко можно переделать на С, но кажеццо я врубился как работает алгоритм рекурсии.
Спасибо всем ответившим. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ага.. привык что большинство вопросов по С++ и даже не посмотрел, что у Вас чистый Си. В общем рекурсия в развернутом виде выглядит так :
Где каждый блок имеет свои экземпляры локальных переменных, а кол-во вложений показывает глубину рекурсии. Это сообщение отредактировал(а) mes - 18.6.2009, 13:10 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |