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