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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2011, 19:32   #1
ПрИуЭт
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 10
Радость Рекурсивные алгоритмы

Правильные скобочные последовательности!
Подсчитать количество правильных скобочных выражений из 2*N круглых скобок. Выражение называется правильным,если оно состоит из 2*N символов и :
-содержит ровно N открывающихся скобок и N закрывающихся;
-фрагменты открытых скобок всегда больше,чем закрытых, либо столько же.

ПОМОГИТЕ ПЛИиииЗ)* это нужно сделать с помощью рекурсии
ПрИуЭт вне форума Ответить с цитированием
Старый 16.11.2011, 20:37   #2
ПрИуЭт
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 10
Печаль

а мне никто не ответит??((
ПрИуЭт вне форума Ответить с цитированием
Старый 16.11.2011, 21:27   #3
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Я лично не понял, что вам надо. От куда посчитать? Что в конце должно получится? При чем тут рекурсия? Какой вид входящих данных? А самое главное где ваши наработки?
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 16.11.2011, 23:18   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
-фрагменты открытых скобок всегда больше,чем закрытых, либо столько же.
простите, но я не смог понять этого условия..
поясните?

вот программа, которая перебирает ВСЕ возможные варианты с 2*N количеством круглых скобок:
Код:
Const N = 5;
procedure ShowVariant(s : string; a, b : integer);
begin
  if (a=0) and (b=0) then begin Writeln(s); Exit; end;
  if a>0 then ShowVariant(s+'(',a-1,b);
  if b>0 then ShowVariant(s+')',a,b-1);
end;

begin
  ShowVariant('',N, N);
end.
это ПОЛНЫЙ текст программы

но, т.к. в задаче стоит условие составить только правильные выражения (я подхожу к этому с точки зрения по принципу соблюдения баланса открыты и закрытых скобок)
то можно добавить к полной генерации добавить проверку выражения на правильность.
получится примерно такая программа:
Код:
Const N = 5;

var 
  CountOfRightVariant : integer;

function isValid(s : string) : boolean;
var i, pair : integer;
begin
  isValid := false;
  pair := 0;
  for i:=1 to Length(s) do
    if s[i]='(' then inc(pair)
    else
      if s[i]=')' then begin 
          dec(pair);
          if pair<0 then Exit;
      end;
  isValid := (pair=0);
end;

procedure ShowVariant(s : string; a, b : integer);
begin
  if (a=0) and (b=0) then begin
      if isValid(s) then Inc(CountOfRightVariant);
      { Writeln(s,' ',);} Exit; end;
  if a>0 then ShowVariant(s+'(',a-1,b);
  if b>0 then ShowVariant(s+')',a,b-1);
end;

begin
  CountOfRightVariant := 0;
  ShowVariant('',N,N);
  WriteLn('Количество правильных вариантов для N=',N,
    ' равно ', CountOfRightVariant);
  readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
РЕКУРСИВНЫЕ АЛГОРИТМЫ С++ Liza Dalbek Фриланс 3 16.06.2011 19:30
рекурсивные алгоритмы maverick12 Паскаль, Turbo Pascal, PascalABC.NET 1 21.06.2010 01:57
Рекурсивные алгоритмы в Паскале. profan Помощь студентам 8 31.03.2010 17:31
Простейшие рекурсивные алгоритмы (ПАСКАЛЬ) Таня.Ку Помощь студентам 1 14.12.2009 16:38