Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 41
1
Delphi 6-7

Рекурсия

10.04.2019, 20:41. Показов 1548. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите разобраться
Задание: в строке могут присутствовать скобки как круглые, так и квадратные
скобки. Каждой открывающей скобке соответствует закрывающая того же
типа (круглой – круглая, квадратной – квадратная). Напишите рекурсивную
функцию, проверяющую правильность расстановки скобок в этом случае.
Пример неправильной расстановки: ( [ ) ].
Выполнить с помощью рекурсии.
Я сделала так, но здесь нет рекурсии
Можно как-то переделать ее на программу с рекурсией?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
   s: string;
   i,j,k: integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
    i,j,k: integer;
begin
 s := Edit1.text;
 if s='' then
 showmessage('Ââåäèòå ïðåäëîæåíèå')
 else
 k:= 0;
 for i:= length(s) downto 1 do
 begin
  if (s[i] = '(') and
     (s[i] = ')') and
     (s[i] = ']') and
     (s[i] = '[') then
  inc(k);
 end;
 for i:=length(s) downto 1 do
  begin
  if not (s[i] in ['(',')','[',']']) then delete(s,i,1);
  end;
 edit2.text:=s;
 for i:=1 to length(s) do
 for j:=1 to 100 do
  begin
   Delete(s,Pos('()',s),2);
   Delete(s,Pos('[]',s),2);
  end;
 edit3.Text:=s;
 if edit2.Text='' then
 exit
 else
 if edit3.Text='' then
 showmessage('Âåðíî')
 else
 showmessage('Íåâåðíî');
end;
end.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2019, 20:41
Ответы с готовыми решениями:

Рекурсия
Привет, помогите пожалуйста надо вычислить рекурсивную функцию :...

Рекурсия
Требуется помощь в решении задачи. ПОЖАЛУЙСТА ПОМОГИТЕ! :cofee2:

Рекурсия
Прочитал https://www.cyberforum.ru/delphi-beginners/thread927744.html о рекурсии. Ничего не понял...

Парная рекурсия
можно ли сделать в одном модуле взаимную рекурсию типа function Add1(n1:Integer):Integer; ...

3
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
11.04.2019, 05:16 2
Лучший ответ Сообщение было отмечено Anreq как решение

Решение

А как у вас вот это условие выполняется:
Цитата Сообщение от Anreq Посмотреть сообщение
Delphi
1
2
3
4
if (s[i] = '(') and
(s[i] = ')') and
(s[i] = ']') and
(s[i] = '[') then
? Как бы, это условие говорит о том, что один символ должен равняться сразу четырем значениям

А вот это мне понравилось, элегантное решение:
Delphi
1
2
3
4
5
6
for i:=1 to length(s) do
for j:=1 to 100 do
 begin
  Delete(s,Pos('()',s),2);
  Delete(s,Pos('[]',s),2);
end;
Только я бы его переиначил немного:
Delphi
1
2
3
4
5
while pos('[]',s) + pos('()',s)  > 0
 begin
  Delete(s,Pos('()',s),2);
  Delete(s,Pos('[]',s),2);
 end;
И как раз это и дает нам путь к рекурсии:

Delphi
1
2
3
4
5
6
7
8
9
procedure DeleteBracket(var s:string);
begin
if pos('[]',s) + pos('()',s)  > 0 then
 begin
   Delete(s,Pos('()',s),2);
   Delete(s,Pos('[]',s),2);
   DeleteBracket(s);
 end;
end;
И тогда с рекурсией код станет вот таким:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
    i,j,k: integer;
begin
 s := Edit1.text;
 
 if s='' then
 showmessage('Ââåäèòå ïðåäëîæåГ*ГЁГҐ');
 {else
 k:= 0;
 for i:= length(s) downto 1 do
 begin
  if (s[i] = '(') and
     (s[i] = ')') and
     (s[i] = ']') and
     (s[i] = '[') then
  inc(k);
 end;} //как я и писал, в чем смысл-то этого цикла?
 if length(s) > 0 then //проверку на длину все же стоит проводить, у вас в случае пустой строки нет exit из процедуры
 for i:=length(s) downto 1 do
   if not (s[i] in ['(',')','[',']']) then 
    delete(s,i,1);
 
 
 edit2.text:=s;
 
 DeleteBracket(s);
 
 edit3.Text:=s;
 
 if edit2.Text='' then
  exit
 else
 if edit3.Text='' then
  showmessage('ÂåðГ*Г®')
 else
  showmessage('ГЌГҐГўГҐГ°Г*Г®');
end;
end.
0
4175 / 1825 / 218
Регистрация: 06.10.2010
Сообщений: 4,111
11.04.2019, 07:54 3
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{$APPTYPE CONSOLE}
 
function check(s: PAnsiChar; lastbracket: AnsiChar=#0): boolean;
begin
  result:=true;
  repeat
    if s^ in ['(','['] then
      result:=check(s+1,s^)
    else if s^=')' then
    begin
      result:=lastbracket='(';
      exit;
    end
    else if s^=']' then
    begin
      result:=lastbracket='[';
      exit;
    end;
    inc(s);
  until (s^<>#0)or(not result);
end;
 
begin
  writeln(check('([])'));
  readln;
end.
0
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 41
11.04.2019, 10:54  [ТС] 4
Nanotentacle, Спасибо большое за помощь!))
0
11.04.2019, 10:54
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2019, 10:54
Помогаю со студенческими работами здесь

графика,рекурсия
возникла такая проблемка: unit myfig2; interface uses SysUtils, Classes, Graphics;...

Рекурсия ошибок
имеется код if Http.HTTPMethod('POST','урл') then begin if...

Рекурсия с квадратом
Всем доброго времени суток, нужно создать программу, которая, при нажатии на кнопку рисует квадрат,...

Рекурсия в DLL
Доброго времени суток! Написал приложение с рекурсивным поиском файлов в указанной и всем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
Как решать конфликты слияния (merge) в Git
bytestream 22.01.2025
Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках кода. Эти конфликты представляют. . .
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru