Страница 1 из 1

рекурсия

Добавлено: 21 июн 2011, 17:36
Gameus_

Код: Выделить всё

...
var st:string;
...
Procedure my_proc(nr:comp);
var nr1:comp;
{
	if ((getfirst STATCALC where STATCALC.nrec=nr)=tsok)
	{ 
	  if (STATCALC.name<>''){ st:=STATCALC.name+'\'+st;	}
	}
	nr1:=STATCALC.cSTATCALC;
	if (nr1<>0){my_proc(nr1);}
}
вызываю:

Код: Выделить всё

...
st:='';
my_proc(STATCALC.nrec);
message(st);
...
В результате для нулевых(корневых) элементов выводится нормально(без рекурсивного вызова), если подсунуть элемент первого уровня, то нулевой не выводится - getfirst STATCALC where STATCALC.nrec=nr не возвращает tsok

Re: рекурсия

Добавлено: 22 июн 2011, 09:15
n0where
рекурсия была расписана недавно. Юзайте поиск

Re: рекурсия

Добавлено: 22 июн 2011, 09:53
edward_K
1. getfirst STATCALC where STATCALC.nrec=nr замените на
getfirst STATCALC where (( nr == STATCALC.nrec))
2. с виду все нормально, добавьте мессаги с nr и nr1
3. В вашем случае хватит и while. Рекурсия нужна чтобы развернуть дерево вниз.

Re: рекурсия

Добавлено: 22 июн 2011, 11:29
Masygreen
вот буквально обсуждали тынц..

Re: рекурсия

Добавлено: 22 июн 2011, 11:45
n0where

Код: Выделить всё

function my_proc(nr:comp):string;
var
s:string;
begin
   if (getfirst STATCALC where ((nr==STATCALC.nrec))=tsok)
   {
s := my_proc(STATCALC.cSTATCALC);
if (s<>'') {
     if (STATCALC.name<>''){ 
s:=STATCALC.name+'\'+s;   
     }
}
my_proc := s;
end;
...
PushPos(#STATCALC);
message(my_proc(STATCALC.nrec));
PopPos(#STATCALC);
...
Не проверял, но должно работать по логике...
Но вызов my_proc(STATCALC.nrec) меня настораживает. Должен быть либо синоним таблицы либо как я написал.

Re: рекурсия

Добавлено: 22 июн 2011, 12:19
Vik
По-моему, вы паритесь ) Если нужно просто вывести строку, содержащую всех родителей конкретного узла, то рекурсия тут нужна как мертвому припарка.. Старый добрый цикл никто не отменял.

Re: рекурсия

Добавлено: 22 июн 2011, 16:50
n0where
Vik писал(а):По-моему, вы паритесь ) Если нужно просто вывести строку, содержащую всех родителей конкретного узла, то рекурсия тут нужна как мертвому припарка.. Старый добрый цикл никто не отменял.
В представленном коде нет рекурсии. Как раз цикл.

Re: рекурсия

Добавлено: 22 июн 2011, 17:29
Vik
Хм. О каком представленном коде вы говорите? Я вижу это:

Код: Выделить всё

function my_proc(nr:comp):string;
{
.....  
 s := my_proc(STATCALC.cSTATCALC);
....
}
Где здесь нет рекурсии, где здесь есть цикл ?

Re: рекурсия

Добавлено: 22 июн 2011, 17:59
edward_K
цикл все таки while
Вообще не гоже передавать переменной поле таблицы, если там внутри потом идет поиск через эту переменную. Есть шанс нарваться что переменную передадут не значением , а ссылкой. Раньше кроме var .. шло значением, но фиг его знает что сейчас, и как будет потом.

Re: рекурсия

Добавлено: 23 июн 2011, 00:30
Masygreen
Ну что за ленивый ... а...

Код: Выделить всё

function my_proc(nr:comp):string;
{
  external _loop STATCALC where ((nr==STATCALC.nrec))
   { 
     if (STATCALC.name<>''){ my_proc:= my_proc +'/'+STATCALC.name;   }
    if (STATCALC.cSTATCALC<>comp(0)){my_proc(STATCALC.cSTATCALC);}
  }
}

Код: Выделить всё

message(my_proc(STATCALC.nrec);