IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Рекурсия, не могу найти ошибку, N нас. пунктов, пары пунктов соединены, узнать, можно ли попасть из
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Кирилл

Репутация: -  0  +


Текст задачи:
Имеется N населенных пунктов, пронумерованных от 1 до N (N = 10).
Некоторые пары пунктов соединены дорогами. Определить, можно ли по
дорогам попасть из пункта 1 в N-й пункт. Информация о дорогах задается в
виде последовательности пар чисел i и j (i < j), указывающих что i-й и j-й
пункты соединены дорогой. Признак конца этой последовательности – пара
нулей.
Из условия я вынес 1 из основных положений, что по кругу между пунктами мы ходить не будем, т.е. например
1-2-3-5-6-1 (- догора), задача после этого сущаственно упростилась:) написал, но не работает прога, помогите плиз найти ошибку.. или мот я в корне был не прав.. наставьте на путь правильный

Мой код:


Program lab;
Type int=integer;
mas=array [1..30, 1..2]of int;
{ 30 - условное число, просто чтобы ограничить массив}
Var fl: boolean;
x: mas;
k:int;

Procedure vvod(a:mas);
Var x,y,i:int;
begin
Writeln('vvedite parbl 4isel');
x:=1;y:=1;i:=0;
While (x<>0) and (y<>0) do
begin
if i<>0 then begin
a[i,1]:=x;
a[i,2]:=y;
end;
Write('vvedite 1 4islo ');readln(x);
Write('vvedite 2 4islo ');readln(y);
i:=1+i
end
end;

procedure find(A:int;var f:boolean);
Var i:int;
begin
if x[A,2]=10 then f:=true
else begin
i:=1;
while (x[i,1]<>0) and (x[i,2]<>0) and (not f) do
begin
if x[A,2]=x[i,1] then
find(i,f);
i:=i+1
end
end
end;

Begin
vvod(x);
fl:=false;
k:=1;
while (x[k,1]<>0) and (x[k,2]<>0) and (not fl) do
begin
if x[k,1]=1
then find(k,fl);
k:=k+1
end;

if fl
then writeln('yes')
else writeln('nno')
End.


первый проход вынес в основную программу, т.к. нужно было сделать 1 проход по всем x(i,1)=1, т.е. тем. у которых первый пункт - наш начальный и в процедуре в стоке "if x[A,2]=x[i,1] then .." не смог бы подставить вместо x[i,1] единицу
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> раньше у меня схожее с этим заменялось введением ещё 1 переменной булевского типа и заменой For на While с 2 ограничениями)

Одно из них - когда счётчик доходит до конца, другое - когда мы нашли элемент, удовлетворяющий условию?
Так

b := false;
for i := n to m do if i mod 789 = 0 then begin
b := true;
break;
end;



Я одно время увлекался такими конструкциями типа b := b or a, но в них проще запутаться, например, легко забыть лишнюю скобку вокруг a, если а сложное выражение, типа c and d (c и d тоже состоят из кучи подвыражений и окружены тройными скобками по бокам), то вместо b := b or (c and d) получается по смыслу b := (b or c) and d. После того, как у меня один вагон стал проезжать сквозь другой, я отказался от таких конструкций. Оператор |= тут бы пригодился, но он всё равно не даст возможности выхода при достижении условия.

А если a - простое выражение, то запись b := b or a всё так же генерирует ветвления, причём делает это ещё хуже, чем при явной форме if a then b := true;
Вот на примере D7:

Хотя да, разницы тут, если всмотреться, нет, просто если b уже достигнуто, то надо выходить и не делать каждый раз новых проверок. Короче, так делать имеет смысл только для компактности исходного кода.

Сообщение отредактировано: TarasBer -


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Cool_abc   Рекурсия, не могу найти ошибку   25.04.2010 5:46
Lapp   наставьте на путь правильный ... первый проход вын…   25.04.2010 7:31
Cool_abc   [b]Добавлено через 4 мин. Да, еще: входные данн…   25.04.2010 17:46
Cool_abc   Рекурсия [b]должна быть элегантной )). funct…   25.04.2010 23:12
volvo   Cool_abc, поиск ошибок начинай прямо с процедуры V…   25.04.2010 13:09
Lapp   эм... здесь же по условию не подходят дходные данн…   26.04.2010 10:17
Cool_abc   Упс!.. мой фолт, извиняюсь, недосмотрел. Ус…   26.04.2010 18:34
Lapp   из условия i<j я понимал, что из этого следует…   27.04.2010 11:13
TarasBer   > раньше у меня схожее с этим заменялось введен…   26.04.2010 20:04
Cool_abc   ... Хотя да, разницы тут, если всмотреться, нет, …   26.04.2010 20:23
TarasBer   Это программа, которую я специально написал только…   26.04.2010 20:31
volvo   Я тебе открою тайну: если перед этим самым циклом …   27.04.2010 16:01
Lapp   Повторяю еще раз: у этого форума задача - научить …   27.04.2010 16:43
TarasBer   > Количество инструкций еще не прямо пропорцион…   27.04.2010 16:12
volvo   В таком случае извините, что столько времени вам н…   27.04.2010 16:46


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 22:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name