Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 072
от 26.12.2002, 12:50

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 126
Отправлено ответов: 366
Активность: 290.4 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


От Администратора



Нашел вот интересную ссылку

Зайдите - не пожалеете!
С ув. к Вам Sensey


Sensey (sensey@ukr.net)


 Список экспертов, ответы которых опубликованы в данном выпуске

Tancho
Статус: Доверительный
Общий рейтинг: 131.14
[Подробней >>]
Lexus
Статус: Начальный
Общий рейтинг: 145.45
[Подробней >>]
Sensey
Статус: Профессиональный
Общий рейтинг: 121.82
URL: Страничка рассылки по Паскалю
Телефон: +38 (0572) 41-76-04 дом.
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 117.39
[Подробней >>]
Byter
Статус: Опытный
Общий рейтинг: 125.7
[Подробней >>]
baldr
Статус: Профессиональный
Общий рейтинг: 114.08
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]
 
Melkor
Статус: Доверительный
Общий рейтинг: 131.32
[Подробней >>]
Pinman
Статус: Опытный
Общий рейтинг: 128.57
URL: Программирование и заработок
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 123. Здравствуйте! Просьба объяснить, что такое РЕКУРСИЯ и как она организуется на Pascal! Мне дали задач... (ответов: 8)

Вопросов: 1, ответов: 8


 Вопрос № 123

Здравствуйте! Просьба объяснить, что такое РЕКУРСИЯ и как она организуется на Pascal! Мне дали задачку, на составление цепочки домино по известному набору костяшек. Сказали, что предпочтительнеё решать Рекурсией или BackTracing'ом! Помогите примером с подробными комментариями или просто расскажите в чём суть рекурсивного алгоритма и как он реализуется! Можно (нужно) на мыло.



Вопрос отправлен: 23.12.2002, 12:46
Отправитель: CanBlow (CanBlow@fromru.com)

[Следующий вопрос >>] [Список вопросов]

Отвечает Tancho

Добрый день, CanBlow!
рекурсия когда процедура или функция вызывает сама себя в
процесе выполнения. Это мощтны инструмент для решения многих
задач, но надо быть внимателные при его пользования так как
если нет условия для выхода из процедуры(функции) то можно
переполнить стек и изпортит прогу! Смотри приложению где дан
пример на фунцию для вычисления чисель Фибоначи.

Приложение:

Ответ отправлен: 25.12.2002, 18:20
Отправитель: Tancho


Отвечает Lexus

Приветствую Вас, CanBlow!
Рекурсивной называют процедуру или функцию, способную в процессе выполнения программы вызвать саму себя.
Например у тебя есть функция: MyFunction(a,b);
Внутри тела этой функции ты можешь снова указать:
MyFunction(c,d); и пользоваться полученными результатами в данной функции. Вот она то и будет называться рекурсивной, а второй вызов будет называться рекурсивным.
Стоит заметить, что придоженная функция будет бесконечной и вызовет зависание. Надо предусмотреть признак выхода.

Приложение:

Ответ отправлен: 26.12.2002, 08:54
Отправитель: Lexus


Отвечает Sensey

Здравствуйте, CanBlow!
Рекурсия вызов процедуры из себя же.
Например, фция факториала:
function f(x:longint):longint;
begin
if f<2 then begin f:=1;exit;end;
f:=x*f(x-1);
end;


Ответ отправлен: 23.12.2002, 14:21
Отправитель: Sensey


Отвечает Ayl

Приветствую Вас, CanBlow!
Рекурсия - это повторный вызов той же процедуры из самой себя (прямая рекурсия) или с помощью другой процедуры (косвенна рекурсия). Например:
Procedure A;
begin
A; {прямая рекурсия}
end;
Procedure A; forward;
Procedure B;
begin
A; {вызываем процедуру A, а в ней будет вызов B}
end;
Procedure A;
begin
B; {Выполнение: ... A->B->A->B ...}
end;
Естественно, что эти примеры нерабочие. В реальных процедурах должен быть предусмотрен выход из процедуры при выполнении некоторого условия. Например, в Приложении - рекурсивная функция вычисления чисел Фиббоначи (наиболее часто приводимы пример).
В твоем случае рекурсивная процедура должна брать очередную костяшку (если таковой нет - печатаешь текущую цепочку и выходишь, это условие прекращения ветки рекурсии) и пробовать добавить ее к уже имеющейся цепочке. Если добавил, то снова вызываешь процедуру добавления, но при этом список доступных костяшек на 1 меньше (ты ее только что включил). Если не смог - то выходишь из процедуры. Соответственно, при этом последняя костяшка автоматически возвращается в неиспользованные и построение цепочки продолжается с предыдущей костяшки.

Приложение:

Ответ отправлен: 23.12.2002, 14:33
Отправитель: Ayl


Отвечает Byter

Доброе время суток, CanBlow!
Рекупсия-это вызов функции или процедуры из сомой себя.
Очень не стабильная вещь,часто переполняет стек и прграмма
гикается.Чтобы не переполнять стек можно сохранять данные
не в функции или процедуре,а в главной проге.
Чаще пользуются функциями.Вызываешь функцию,если определенное условие не выполнено то вызываешь ее опять из ее же .Если на это условие верно,возвращаешься в вызываемую функцию(если нет продолжаешь вызов) и так пока не выйдешь в
то место где начал вызов.
Пример:
Function Rec:byte;
begin
If k>0 then
k:=Rec;
else
Rec:=k-1;
end;
Begin
Rec;
End.

Ответ отправлен: 23.12.2002, 16:02
Отправитель: Byter


Отвечает baldr

Доброе время суток, CanBlow!
:) Вот сейчас я уже просто вижу, что подобные задачи легко решаются на PROLOG. Но, как показал
опрос, практически никто из экспертов им не владеет. :( Один я что-то пробую... :)
Ну а на Паскале... Тоже можно, но много мусора...
В общем, рекурсия - это просто вызов процедурой самой себя. Если не предусмотреть никакого
условия, то она будет бесконечной и комп зависнет. Применяется в случае, когда надо в каждой
итерации создавать много локальных переменных. Например, при переборах. Тебе нужен именно такой
способ. То есть, перебираешь все возможные варианты и выбираешь лучший...
BackTracing, по-моему, это тоже из области рекурсии, но когда решение возвращается при
"раскручивании" этой рекурсии назад, то есть, при множественных возвратах из цепочки рекурсии..
Непонятно, да? :(


Ответ отправлен: 24.12.2002, 01:36
Отправитель: baldr


Отвечает Melkor

Здравствуйте, CanBlow!
Суть рекурсии в том, что функция вызывает сама себя (прямая рекурсия) или вызывает другую функцию, которая потом вызывает первую функцию и т.д. (косвенная рекурсия), но не стоит забывать о условии прекращения рекурсии, иначе прога виснет или произойдет переполнение стека. Пример рекурсивного вычисления факториала (см. приложение).

Приложение:

Ответ отправлен: 24.12.2002, 02:05
Отправитель: Melkor


Отвечает Pinman

Приветствую Вас, CanBlow!
procedure MyProc(A:byte);
begin
WriteLn(A);
MyProc(A-1);
end;
begin
MyProc
end.
Короче, рекурсия - это когда процедура вызывает сама себя, но с другими параметрами. А в общем все работает, как обычно, только избегай зацикливания!

Ответ отправлен: 24.12.2002, 23:01
Отправитель: Pinman



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (40)
C / C++ (29)
Perl (5)
Delphi (22)
Pascal (23)
Basic / VBA (11)
Java / JavaScript (7)
PHP (4)
MySQL / MSSQL (5)
Пользователю
Windows 95/98/Me (32)
Windows NT/2000/XP (27)
"Железо" (31)
Поиск информации (13)
Администратору
Windows NT/2000/XP (11)
Linux / Unix (14)
Юристу
Гражданское право (7)
Семейное право (3)
Трудовое право (4)
КоАП (2)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное