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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 19:37   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Это же все из-за рекурсии. я просто не пойму каким образом это происходит. вы не поняли суть
код выполняется последовательно.
так что получается так:
Код:
procedure prObh(Node:Pnode);
begin
  if node<>nil then
  begin
   form1.Edit1.Text := form1.Edit1.Text+node.NKey+' ';
   probh(node.pLeft);     //1
   probh(node.pRight);    //2
  end;
end;
допустим код пройдет три итерации от основного вызова.
выйдут такие вызовы:
1
1
1
2
2
2
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.12.2011, 19:38   #12
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

googl, в первом варианте работет сначала vyvod(node.pRight,tmpItem) а потом срабатывает vyvod(node.pLeft,tmpItem).
Может ввести какой-то параметр, который будет ответственным за выбор?
Код:
procedure prObh(Node:Pnode; Param:TParam);
begin
  if node<>nil then
  begin
   form1.Edit1.Text := form1.Edit1.Text+node.NKey+' ';
   case node.Param of
    npLeft: probh(node.pLeft,Param);     
    npRight: probh(node.pRight,Param);    
  end;
end;

Последний раз редактировалось kettanaito; 15.12.2011 в 19:43.
kettanaito вне форума Ответить с цитированием
Старый 15.12.2011, 19:41   #13
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
googl, честно говоря я не понимаю Вашего условия. Как можно сделать какую-либо операцию с Node если его значение равно nil? (Вы пытаетесь сделать vyvod(node.pLeft,tmpItem) при пустом узле, зачем?)
в данный момент мы рассматриваем обход. но там же все работает ведь.
я могу туда и root передать
googl вне форума Ответить с цитированием
Старый 15.12.2011, 19:42   #14
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);     //1
   probh(node.pRight);    //2
  end;
end;
допустим код пройдет три итерации от основного вызова.
выйдут такие вызовы:
1
1
1
2
2
2
ну объясни, пожалуйста, почему. я вот и не понимаю этого. почему он 1 пропускает и вызывает 2? Это специфика рекурсивного вызова или что?
googl вне форума Ответить с цитированием
Старый 15.12.2011, 19:44   #15
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
googl, в первом варианте работет сначала vyvod(node.pRight,tmpItem) а потом срабатывает vyvod(node.pLeft,tmpItem).
Может ввести какой-то параметр, который будет ответственным за выбор?
Код:
procedure prObh(Node:Pnode; Param:TParam);
begin
  if node<>nil then
  begin
   form1.Edit1.Text := form1.Edit1.Text+node.NKey+' ';
   case node.Param of
    npLeft: probh(node.pLeft,Param);     
    npRight: probh(node.pRight,Param);    
  end;
end;
мне не нужно вводить ничего. все работает. я просто хочу разобраться как. эти примеры давали на лекции. я вот сел разбираться и не въеду
googl вне форума Ответить с цитированием
Старый 15.12.2011, 20:00   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
ну объясни, пожалуйста, почему. я вот и не понимаю этого. почему он 1 пропускает и вызывает 2? Это специфика рекурсивного вызова или что?
почему пропускает, я же написал как вызовы пойдет.
у вас выходит так что сначало он пойдет до упора влева вниз, лишь потом направо начнет(заходя налево при необходимости).

как я понял это двоичное дерево, итого выходит имея дерево вида:

(нижняя строка нам не нужна)
разбор его в вашей процедуре пойдет так:
m
m.left->e
e.left->c
c.left->a
a.left->nil(условие не выполнится)
a.right->nil(условие не выполнится)
c.right->nil(условие не выполнится)
e.right->g
g.left->nil(условие не выполнится)
g.right->k
k.left->nil(условие не выполнится)
k.right->nil(условие не выполнится)
m.right->s
s.left->p
p.left->o
o.left->nil(условие не выполнится)
o.right->nil(условие не выполнится)
p.right->s
s.left->nil(условие не выполнится)
s.right->nil(условие не выполнится)
s.right->y
y.left->nil(условие не выполнится)
y.right->nil(условие не выполнится)

вот все итерации для дерева на картинке.
что еще не понятного?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.12.2011, 20:10   #17
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

мне все понятно. спасибо тебе огромное. вот сути я так и не понял. почему, если условие не выполняется, т.е. узел nil происходит вызов probh(node.pRight), если они оба стоят в одном блоке. т.е. если условие не выполняется, по идее конец должен же быть. вот. мне не понятен сам процесс рекурсивного вызова.
вот если так написать
Код:
if nodeM<>nil then
 probh(node.pLeft)
else
 probh(node.pRight);
то понято. там же то же самое, только без ифов. вот мне и не понятен механизм вызова. вот и все. я же писал: почему вызывает 2, если он должен работу по принципу while завершить
googl вне форума Ответить с цитированием
Старый 15.12.2011, 20:15   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас что написано?
Код:
ЕСЛИ текущий элемент НЕ nil, ТО
    добавить текст в Edit
    вызвать процедуру с указателем на левый лист
    вызвать процедуру с указателем на правый лист
а то что вы мне рассказываете пишется в коде как:
Код:
if node.left<>nil then pr0bh(node.left);
if node.right<>nil then pr0bh(node.right);
Цитата:
если они оба стоят в одном блоке. т.е. если условие не выполняется, по идее конец должен же быть.
идет конец, но для текущего листа, а вызов то потом идет для правого листа родителя.
параметры то проверяйте иногда(раз уж отладкой пользуетесь)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.12.2011, 20:30   #19
googl
Форумчанин
 
Регистрация: 05.06.2010
Сообщений: 154
По умолчанию

Ура. Теперь понял))) Спасибо большущее, мужики!!!
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