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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2010, 21:13   #1
woodey
Новичок
Джуниор
 
Регистрация: 18.11.2010
Сообщений: 3
По умолчанию Вывести все правильные скобочные выражения размера 2N.

В школе задали, люблю информатику, но вот тут что-то не выходит, хотя примерный и понятно.. Помогите, напиши кусок программы в паскале или дайте наводку на правильный алгоритм. Задача на тему рекурсия, 9 класс

Построить все правильные скобочные выражения длины 2N, то есть те, которые содержат по N правых и N левых скобок.

Заранее спасибо)
woodey вне форума Ответить с цитированием
Старый 18.11.2010, 22:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в некоторых случаях рекурсия - это просто находка для решения задачи.

ловите вот такое решение:
Код:
procedure ShowVariant(s : string; a, b : integer);
begin
  if (a=0) and (b=0) then begin Writeln(s); Exit; end;
  if (a>0) and (b>=a) then ShowVariant(s+'(',a-1,b);
  if b>0 then ShowVariant(s+')',a,b-1);
end;

var N : integer;
begin
  N := 4;
  ShowVariant('',N,N);
  readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.11.2010, 22:21   #3
woodey
Новичок
Джуниор
 
Регистрация: 18.11.2010
Сообщений: 3
По умолчанию

Спасибо, сейчас попробуем)
woodey вне форума Ответить с цитированием
Старый 19.11.2010, 14:54   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Редактировано под delphi, вроде верно:
Код:
procedure ShowVariant(s : string; a, b : integer; var R :string);
begin
  if (a=0) and (b=0) then
  begin
    R := R + s + #13;
    Exit;
  end;
  if (a>0) and (b>=a) then
   ShowVariant(s+'(', a-1, b, R);
  if b>0 then
   ShowVariant(s+')', a, b-1, R);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s :string;
  N : integer;
begin
 N := 4;
 S := '';
 ShowVariant('', N, N, S);
 ShowMessage(S);
end;
Alter вне форума Ответить с цитированием
Старый 19.11.2010, 20:21   #5
woodey
Новичок
Джуниор
 
Регистрация: 18.11.2010
Сообщений: 3
По умолчанию

Первый вариант подошел идеально, чуть-чуть под себя подстроил задал N.
Спасибо

Все не получается, хотя вроде все перепробовал..
Как сосчитать кол-во строк?

Думал ввести некое l
Код:
procedure Skobki(s: string; a, b :integer; var l :longint);
begin
if (a=0) and (b=0) then
begin
writeln(s);
l:=l+1;
exit;
end;
if (a>0) and (b>=a) then Skobki(s+'(',a-1,b, l);
if b>0 then Skobki(s+')',a,b-1, l);
end;
Но он все равно выводит 0, что не так?


Так, все, сам допер, всем спасибо)

Последний раз редактировалось Stilet; 20.11.2010 в 17:23.
woodey вне форума Ответить с цитированием
Старый 20.11.2010, 00:16   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
begin
l:=0; {убрать!!}
if (a=0) and (b=0) then
выкиньте инициализацию I:=0 из начала рекурсивной процедуры, ведь, каждый раз, когда она (процедура) вызывается счётчик обнуляется...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2021, 18:34   #7
canadamoscow
Пользователь
 
Аватар для canadamoscow
 
Регистрация: 16.05.2020
Сообщений: 57
По умолчанию

Сгенерировать правильные скобочные выражения размера 2N
на PascalABC.net для одно, двух или более видов пар скобок:
Код:
var n := 3;
var res: string;

procedure P(s: string; a, b: Integer);
begin
  if (a=0) and (b=0) then begin Write(res,' '); Exit end;
  if b>0 then begin
     s += '('; res += '('; P(s, a+1, b-1);            {один вид скобок}
      s[^1] := '['; res[^1] := '['; P(s, a+1, b-1);   {два} //строку можно закомментировать
      s[^1] := '{'; res[^1] := '{'; P(s, a+1, b-1);   {три} //строку можно закомментировать
      s[^1] := '<'; res[^1] := '<'; P(s, a+1, b-1);   {четыре} //строку можно закомментировать
     s := s[:^1]; res := res[:^1];    //избавляемся от последнего символа s := Copy(s, 1, Length(s)-1)
  end;
  if a>0 then begin
      case s[^1] of       // case s[Length(s)] of
         '(' : res += ')';
         '[' : res += ']';
         '{' : res += '}';     
         '<' : res += '>';     
      end;
      P(s[:^1], a-1, b);
      res := res[:^1];    //избавляемся от последнего символа
  end;
end;

begin
  P('', 0, n);
end.

Последний раз редактировалось canadamoscow; 10.06.2021 в 14:44.
canadamoscow вне форума Ответить с цитированием
Старый 09.06.2021, 22:22   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Рыться в архивах 10-ти летней давности может быть и полезно, но вот предлагать такое решение ...

Возьмите книжку А.Шень, Программирование: теоремы и задачи.
У меня 2004-го года.
Открываете стр. 97 и читаете алгоритм решения этой задачи для любого числа скобок.
Реализуете этот алгоритм на любом языке.

Там ещё много всяких алгоритмов изложено.
Читайте и пишите в свой удовольствие и радуйте нас хорошими и понятными решениями ...

PS: PascalABC - это наше всё
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 09.06.2021, 22:55   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Рыться в архивах 10-ти летней давности может быть и полезно...
За 10 лет наука шагнула семимильными шагами - не угнаться
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести все файлы диры Mihanches Общие вопросы Delphi 3 19.09.2010 09:07
Регулярные выражения. Выбрать все начиная с 1 и заканчивая 2, но без 3 vvzone PHP 9 02.04.2010 16:21
скобочные выражения Visual C++ rest Помощь студентам 4 15.09.2009 01:47
Скобочные выражения(язык C) HellForce Помощь студентам 6 08.05.2009 23:42
при изменении размера формы, все компоненты на ней оставались на своих местах ***СкаЙ*** Помощь студентам 15 13.06.2007 11:13