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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 18:13   #1
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию Не пойму как работает рекурсия

Вот процедура прямого обхода дерева.

Код:
procedure prObh(Node:Pnode);
begin
  if node<>nil then
  begin
   form1.Edit1.Text := form1.Edit1.Text+node.NKey+' ';
   probh(node.pLeft);
   probh(node.pRight);
  end;
end;
Вот смотрите, если условие выполняется-вызывается probh(node.pLeft);
Если не выполняется probh(node.pRight);
Но вот не могу понять как это происходит. Они же в одном begin-end стоят. Помогите разобраться
googl вне форума Ответить с цитированием
Старый 15.12.2011, 19:15   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Не можешь понять, потому что неправильно трактуешь.

Если условие выполняется, то они вызываются оба. Один за другим - ровно как и написано.

Если условие не выполняется, то мало того, что ни один из них не вызывается, так ещё и в form1.Edit1.Text ничего не приписывается.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 15.12.2011, 19:25   #3
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

googl, присоединившись к предыдущему оратору разъясню:
Код:
if Условие выполнено then 
begin
Действия при выполненом условии
end 
else
begin
Действия при не выполненом условии
end;
Все остальные процедуры/функции/что-либо, которые описаны до или перед этой схемой будут выполнятся без каких либо условий, всегда.
kettanaito вне форума Ответить с цитированием
Старый 15.12.2011, 19:29   #4
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
googl, присоединившись к предыдущему оратору разъясню:
Код:
if Условие выполнено then 
begin
Действия при выполненом условии
end 
else
begin
Действия при не выполненом условии
end;
Все остальные процедуры/функции/что-либо, которые описаны до или перед этой схемой будут выполнятся без каких либо условий, всегда.
да я все это знаю. при пошаговом выполнении то не так получается.

вот посмотрите программу
Вложения
Тип файла: rar Дерево.rar (340.0 Кб, 11 просмотров)
googl вне форума Ответить с цитированием
Старый 15.12.2011, 19:32   #5
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию 123

Поставьте точку останова при записывании в едит и дальше выполняйте пошагово. процедура же заново вызывается, поэтому до Right не доходит. а Right выполняется только тогда когда nil вот я и не пойму. Это же все из-за рекурсии. я просто не пойму каким образом это происходит. вы не поняли суть
googl вне форума Ответить с цитированием
Старый 15.12.2011, 19:32   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

наверно потому что вы не доглядели что при рекурсии вы вечно входите в эту же функцию снова и снова?
и пока не будет условие false, вы не увидите перехода ко второму вызову самого себя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.12.2011, 19:34   #7
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Может быть так:
Код:
procedure vyvod(Node:pNode;item:TTreeNode);
var
  tmpItem:TTreeNode;
Begin
 k:=k+1;

  if node<>nil then
  begin
  tmpItem:=form1.TreeView1.Items.AddChild(item,node.NKey+'('+inttostr(node.nCount)+')');
    if tmpitem<>nil then vyvod(node.pRight,tmpItem) else vyvod(node.pLeft,tmpItem);
  end;
End;
kettanaito вне форума Ответить с цитированием
Старый 15.12.2011, 19:34   #8
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию 123

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
наверно потому что вы не доглядели что при рекурсии вы вечно входите в эту же функцию снова и снова?
и пока не будет условие false, вы не увидите перехода ко второму вызову самого себя.
я вижу это и понимаю.
Цитата:
и пока не будет условие false, вы не увидите перехода ко второму вызову самого себя
но стоят же они оба в одном бегин енд. вот я и хочу понять каким образом это происходит. условие же не выполняется и по идее должно все окончится. я еще раз спрашиваю: это специфика рекурсии или что?
googl вне форума Ответить с цитированием
Старый 15.12.2011, 19:35   #9
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

googl, честно говоря я не понимаю Вашего условия. Как можно сделать какую-либо операцию с Node если его значение равно nil? (Вы пытаетесь сделать vyvod(node.pLeft,tmpItem) при пустом узле, зачем?)
kettanaito вне форума Ответить с цитированием
Старый 15.12.2011, 19:36   #10
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
Может быть так:
Код:
procedure vyvod(Node:pNode;item:TTreeNode);
var
  tmpItem:TTreeNode;
Begin
 k:=k+1;

  if node<>nil then
  begin
  tmpItem:=form1.TreeView1.Items.AddChild(item,node.NKey+'('+inttostr(node.nCount)+')');
    if tmpitem<>nil then vyvod(node.pRight,tmpItem) else vyvod(node.pLeft,tmpItem);
  end;
End;
ну это то понятно. так должно быть. но работает и в первом варианте. я же говорю: при пошаговом выполнении вызов right происходит при невыполнении условия
googl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа не работает в Code Block, не пойму почему. Stunt Man Помощь студентам 1 03.06.2011 19:38
Не пойму зачем не работает?! Jone200991 Помощь студентам 0 31.05.2011 14:45
Не пойму как работает цикл Lotles Общие вопросы C/C++ 4 29.11.2010 02:08
не пойму правильно ли работает программа серг Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.05.2010 14:58
Паскаль. рекурсия. числа. объясните, как работает код [silver beast] Помощь студентам 2 21.01.2009 05:00