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

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

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

> Рекурсия, не могу найти ошибку, N нас. пунктов, пары пунктов соединены, узнать, можно ли попасть из
Cool_abc
сообщение 25.04.2010 1:46
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 27.04.2010 12:01
Сообщение #2


Гость






Цитата
А если a - простое выражение, то запись b := b or a всё так же генерирует ветвления, причём делает это ещё хуже, чем при явной форме if a then b := true;
Вот на примере D7:
Я тебе открою тайну: если перед этим самым циклом поставить {$b-}, то ассемблерный листинг будет длиннее, чем если поставить {$b+}. Однако выполняться первый случай будет в несколько раз быстрее, чем второй. И что? Количество инструкций еще не прямо пропорционально времени их выполнения.

Еще одна тайна: Дельфи 2006 может показать другой листинг. 2009 - третий, а 2010? Сколько компиляторов - столько и мнений... Хочешь - еще открою тебе неизведанное? На твоем процессоре код Х будет выполняться за время Т, на другом - за время Т/3. Не веришь? Уже забыл, что я тебе показывал (когда твоя супер-вылизанная программа проиграла по скорости у меня на машине по скорости моей программе, написанной в лоб, безо всяких ухищрений в два раза). Опять начинаешь старую песню? dry.gif

Повторяю еще раз: у этого форума задача - научить программировать. Точка. Ни о какой оптимизации (тем более - предварительной) речи не идет. Все оптимизации кончаются одинаково: "я оказался не готов к способности окон менять размеры и к тому, что у всех разное разрешение экрана." (С) кто_это_написал_ты_мне_не_напомнишь_?

Точно так же ты можешь оказаться не готов читать чужой код, содержащий совершенно легитимные синтаксические конструкции. А таких "программистов" (которые изо всех конструкций языка знают только for/while/if, и даже про case не слышали никогда, потому что вот подобный тебе "исследователь" говорил им, что case работает медленнее чем несколько if-ов, забывая однако уточнить, на какой машине и с использованием какого компилятора, и вообще КАК он это выяснил) я видел достаточно.
 К началу страницы 
+ Ответить 
Lapp
сообщение 27.04.2010 12:43
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(volvo @ 27.04.2010 13:01) *
Повторяю еще раз: у этого форума задача - научить программировать.
Главная и единственная задача этого форума, на мой взгляд - общение. Плюс обучение общению, как естественное приложение. Каждый может поучавствовать в беседе и высказать мнение (если это не троллинг).

На мой взгляд, Тарас дело сказал. Это не оптимизация даже, это прямое улучшение алгоритма. Оно не во всех случаях удобно и даже применимо, но тут вполне к месту. Использование IF тут сильно картину не портит, я согласен. Экономия не такая большая, но тем не менее..

Давайте держаться в рамках темы и доброжелательности.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 20.07.2025 18:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"