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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2009, 00:28   #1
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию (С++) Рекурсия

Всем доброго времени суток! Раньше никогда не использовал рекурсию, однако считал ее аналогом цикла, более ресурсоемкого, но изящного. Однако теперь захотелось попробовать поработать с бинарными деревьями (сразу говорю - лаба не обязательная )

Итак..в методичке приведена функция для обхода ВСЕГО дерева:

Подскажите, плиз, как она работает...и как мы можем вообще попасть в строчку walkTree(p->pright);. Заранее спасибо!
Код:
template<class T>
void walkTree(TNode<T>* p)
{
 if(p)
 {
  walkTree(p-.pleft);
  cout<<p->value<<' ';
  walkTree(p->pright);
 }
}
Troi666 вне форума Ответить с цитированием
Старый 23.05.2009, 00:36   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
template<class T>
void walkTree(TNode<T>* p) //принимаем указатель на элемент дерева
{
 if(p)  // если этот элемент существует...
 {
  walkTree(p->pleft);  // то спускаемся на уровень ниже и смотрим левую ветку
  cout<<p->value<<' ';  // тут выводим значение поля текущего элемента
  walkTree(p->pright);  // а тут спускаемся и смотрим правую ветку
 }
}
Цитата:
.и как мы можем вообще попасть в строчку walkTree(p->pright);.
Ну ведь pright - это указатель на тип.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 00:46   #3
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Цитата:
Ну ведь pright - это указатель на тип.
Согласен! Но не произойдёт ли так, что: мы вызываем функцию обхода walkTree. Она начинает свою работу. Доходит до строчки walkTree(p->pleft); , где вызывает снова саму себя. И так до конца ветки. Получается, что сюда: cout<<p->value<<' '; walkTree(p->pright); мы не попадаем никогда?
Troi666 вне форума Ответить с цитированием
Старый 23.05.2009, 00:53   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Доходит до строчки walkTree(p->pleft); , где вызывает снова саму себя. И так до конца ветки
Да. Дойдем до конца ветки, после чего наткнемся на NULL. Условие ( if(p) ) не выполнится и мы выйдем из функции. Таким образом управление вернется к функции (walkTree), которая обрабатывает предыдущий элемент и мы перейдем к следующей инструкции. То есть, к
Код:
cout<<p->value<<' ';
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 01:04   #5
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Хмм...начинаю понимать Тоесть сколько раз функция вызывает саму себя - столько раз она запоминает своё состояние? Если да - то как? Копирует свой код + параметры в оперативную память, или иначе? И если всё так - то, как же нам насовсем выйти из функции (не именно из этой, а из любой рекурсивной)? Что даст return? Переход на 1 функцию вверх или выход из всей рекурсивной функции целиком?
Troi666 вне форума Ответить с цитированием
Старый 23.05.2009, 01:09   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Troi666
Тоесть сколько раз функция вызывает саму себя - столько раз она запоминает своё состояние? Если да - то как?
Адрес возврата и локальные переменные функции помещаются в стек.
Таким образом ничто не потеряется.
Цитата:
И если всё так - то, как же нам насовсем выйти из функции (не именно из этой, а из любой рекурсивной)? Что даст return? Переход на 1 функцию вверх или выход из всей рекурсивной функции целиком?
Выход из функции, вызванной рекурсивно, возвращает управление в функцию, которая ее вызвала. К следующей за вызовом инструкции.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 01:20   #7
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Sazary Спасибо! Теперь почти всё стало ясно Остаётся 1 вопрос. Можем ли мы вернуться на несколько уровней функции выше "вручную" ? Допустим функция погрузилась на 7 уровней рекурсии. а нам стал очень нужен 2-й. Можем ли мы как-то на него перейти?
Troi666 вне форума Ответить с цитированием
Старый 23.05.2009, 01:36   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Troi666
Допустим функция погрузилась на 7 уровней рекурсии. а нам стал очень нужен 2-й. Можем ли мы как-то на него перейти?
Вроде, как-то можно.. Но я этим вопросом не интересовался )

Интересно, а зачем вам может понадобиться вернуться на несколько уровней?
Собственно, ведь рекурсия обычно и используется там, где нужно последовательно обойти все вершины (или еще что-то).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 01:50   #9
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Честно говоря, где используется рекурсия не знал, так как мы с ней только знакомимся. Поэтому и хочется узнать о том, как ее можно использовать по максимуму А задание очень интересное. К счастью лаба не обязательная, но сделать хочется.

Задание: Построить бинарное дерево выражений для заданного выражения: ((3+4)*(8-(3*2)))*(9*(7+4))
Troi666 вне форума Ответить с цитированием
Старый 23.05.2009, 02:01   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Troi666, ну попробуйте
С деревьями знаком довольно поверхностно, поэтому поиск вам больше подскажет )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия. p@ul Помощь студентам 4 30.12.2009 14:46
Рекурсия Claster Помощь студентам 7 24.09.2008 20:52
рекурсия Vital_k Паскаль, Turbo Pascal, PascalABC.NET 1 08.02.2008 13:09
Рекурсия АнНютик Паскаль, Turbo Pascal, PascalABC.NET 1 29.01.2008 22:50
Рекурсия Pravednik Помощь студентам 3 21.01.2008 14:18