Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2008, 21:49   #1
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию выход из рекурсии

народ! помогите выйти из рекурсии. я придумал такой вариант(реальный код уже потерян):
Код:
f:boolean=true;

procedure q(a:byte);
begin
     if f then a:=a+1;
     if f then q(a);
     if f ...
     if f then 
         if a=x then f:=false;
end;
а как будет правильно? ведь exit выводит только из текущего запущенного варианта...
Упс...
L_M вне форума Ответить с цитированием
Старый 24.09.2008, 22:14   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
а как будет правильно? ведь exit выводит только из текущего запущенного варианта...
Правильно будет первой строкой поставить
Код:
if not f then
exit;
Вот и произойдет циклический выход...
mihali4 вне форума Ответить с цитированием
Старый 28.09.2008, 22:32   #3
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

это опять же нерационально. да, при входе в процедуру программа будет сразу выходить, но сколько таких входов еще будет? в дальнейший цикл программа уже не пойдет, но все предыдущие входы будут использованы. для экономии времени уж лучше как я предлагаю...
Упс...
L_M вне форума Ответить с цитированием
Старый 28.09.2008, 22:38   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А о стеке вы не подумали?
mihali4 вне форума Ответить с цитированием
Старый 29.09.2008, 09:09   #5
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от L_M Посмотреть сообщение
народ! помогите выйти из рекурсии. я придумал такой вариант(реальный код уже потерян):
Код:
f:boolean=true;

procedure q(a:byte);
begin
     if f then a:=a+1;
     if f then q(a);
     if f ...
     if f then 
         if a=x then f:=false;
end;
а как будет правильно? ведь exit выводит только из текущего запущенного варианта...
и не выйдешь
у тебя а передается не по ссылке и q(a); ничего не делает
попробуй для начала
Код:
procedure q(var a:byte);
s.Creator вне форума Ответить с цитированием
Старый 29.09.2008, 09:29   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

L_M, ваш первый вариант никогда не завершится, так как "a" не увеличивается. Поставте "var", и всё случится. И еще, зачем стока if-ов и какой-то "f".
Код:
procedure q(var a:byte);
begin
  if a < x then begin
    a:=a+1;
    q(a);
    ...
  end;
end;
В зависимости от того, как вам лучше, можно в условии написать a <= x.
Sibedir вне форума Ответить с цитированием
Старый 02.10.2008, 22:11   #7
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

Да нет, этот код я написал просто для примера, он конечно не верен. if нужен как раз для выхода, т.е. перед каждым оператором проверяется, нужно ли его выполнять или пора завершить рекурсию. например в таком коде
Код:
procedure qw(i:integer;)
begin
    for j:=1 to n do
         qw(i+j);
end;
если писать, как вы предлагаете условие в начале, то при достижении условия текущая процедура завершиться, апредыдущая будет продолжать цикл for. этого я избегаю, ставя условие перед каждым оператором. Вообще я говорю не о конкретной задаче, а о принципиальном выходе(т.е. принципе выхода).
P.S. еще один вариант можно применять для некоторых задач - завершать программу при достижении условия - только не знаю как это сделать в консоли. и еще: стек конечно слово красивое, но ничего не объясняет. или выы предлагаете чтобы при достижении условия программа сама вытаскивала из стека и тем самым прекращалась(хороший вариант, но не знаю возможен ли)? или имеется в виду, что прекращать ее не надо - стек переполниться и она сама завершиться?
Упс...

Последний раз редактировалось L_M; 02.10.2008 в 22:19.
L_M вне форума Ответить с цитированием
Старый 03.10.2008, 07:39   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А как вам такой вариант
Код:
function MyFunc (Inp: Integer): Boolean;
var
  i: Integer;
begin
  if {inp не удовлетворяет условиям} then begin
    Result := False;
  end
  else begin 
    for i := 1 to Inp do begin
      Result := MyFunc (f(i));
      if not Result then Break;
    end;
  end;
end;
Этот код ничего не делает, это только пример рекурсии и ее завершения.
Но вы сами говорили:
Цитата:
Вообще я говорю не о конкретной задаче, а о принципиальном выходе(т.е. принципе выхода).
P.S.: Мой вам совет. Получить хорошие навыки программирования не решая конкретных задач не возможно. Лучше ищите или выдумывайте задачи хоть как-то привязанные к жизни, чем выдумывать код, который что-то там делает.
Sibedir вне форума Ответить с цитированием
Старый 03.10.2008, 17:46   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

не выход из рекурсии а условие продолжения рекурсии
function f(par): integer;
begin
if par<100 then result:= par + f(par+1);
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.10.2008, 18:03   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Я ж и говорю, все зависит от поставленной задачи.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсии Logan Паскаль, Turbo Pascal, PascalABC.NET 1 13.05.2008 08:52
Паскаль рекурсии СРОЧНО Solana Помощь студентам 3 14.12.2007 17:49
Рекурсии при составлении программ Дуня Помощь студентам 3 06.12.2006 20:35