рекурсия

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Gameus_
Местный житель
Сообщения: 209
Зарегистрирован: 18 окт 2006, 17:03
Откуда: Ростов на Дону Новочеркасск Новороссийск
Контактная информация:

рекурсия

Сообщение 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
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: рекурсия

Сообщение n0where »

рекурсия была расписана недавно. Юзайте поиск
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: рекурсия

Сообщение edward_K »

1. getfirst STATCALC where STATCALC.nrec=nr замените на
getfirst STATCALC where (( nr == STATCALC.nrec))
2. с виду все нормально, добавьте мессаги с nr и nr1
3. В вашем случае хватит и while. Рекурсия нужна чтобы развернуть дерево вниз.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: рекурсия

Сообщение Masygreen »

вот буквально обсуждали тынц..
Время ведет!
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: рекурсия

Сообщение 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) меня настораживает. Должен быть либо синоним таблицы либо как я написал.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: рекурсия

Сообщение Vik »

По-моему, вы паритесь ) Если нужно просто вывести строку, содержащую всех родителей конкретного узла, то рекурсия тут нужна как мертвому припарка.. Старый добрый цикл никто не отменял.
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: рекурсия

Сообщение n0where »

Vik писал(а):По-моему, вы паритесь ) Если нужно просто вывести строку, содержащую всех родителей конкретного узла, то рекурсия тут нужна как мертвому припарка.. Старый добрый цикл никто не отменял.
В представленном коде нет рекурсии. Как раз цикл.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: рекурсия

Сообщение Vik »

Хм. О каком представленном коде вы говорите? Я вижу это:

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

function my_proc(nr:comp):string;
{
.....  
 s := my_proc(STATCALC.cSTATCALC);
....
}
Где здесь нет рекурсии, где здесь есть цикл ?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: рекурсия

Сообщение edward_K »

цикл все таки while
Вообще не гоже передавать переменной поле таблицы, если там внутри потом идет поиск через эту переменную. Есть шанс нарваться что переменную передадут не значением , а ссылкой. Раньше кроме var .. шло значением, но фиг его знает что сейчас, и как будет потом.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: рекурсия

Сообщение 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);
Время ведет!
Ответить