Форум программистов, компьютерный форум CyberForum.ru

Левая рекурсия. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
24.04.2011, 16:07     Левая рекурсия. #1
Левая рекурсия
(Время: 1 сек. Память: 16 Мб Сложность: 20%)

В теории формальных грамматик и автоматов (ТФГиА) важную роль играют так называемые контекстно-свободные грамматики (КС-грамматики). КС-грамматикой будем называть четверку, состоящую из множества N нетерминальных символов, множества T терминальных символов, множества P правил (продукций) и начального символа S, принадлежащего множеству N.

Каждая продукция p из P имеет форму A –> a, где A нетерминальный символ (A из N), а a – строка, состоящая из терминальных и нетерминальных символов. Процесс вывода слова начинается со строки, содержащей только начальный символ S. После этого на каждом шаге один из нетерминальных символов, входящих в текущую строку, заменяется на правую часть одной из продукций, в которой он является левой частью. Если после такой операции получается строка, содержащая только терминальные символы, то процесс вывода заканчивается.

Во многих теоретических задачах удобно рассматривать так называемые нормальные формы грамматик. Процесс приведения грамматики к нормальной форме часто начинается с устранения левой рекурсии. В этой задаче мы будем рассматривать только ее частный случай, называемый непосредственной левой рекурсией. Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.

Задана КС-грамматика. Требуется Найти количество правил, содержащих непосредственную левую рекурсию.
Входные данные

Первая строка входного файла INPUT.TXT содержит количество n (1 <= n <= 1000) правил в грамматике. Каждая из последующих n строк содержит по одному правилу. Нетерминальные символы обозначаются заглавными буквами латинского алфавита, терминальные - строчными. Левая часть продукции отделяется от правой символами –>. Правая часть продукции имеет длину от 1 до 30 символов.
Выходные данные

В выходной файл OUTPUT.TXT выведите ответ на задачу.
Пример
INPUT.TXT
3
S->Sabc
S->A
A->AA
OUTPUT.TXT
2
Условие запутанное в хлам...! Даже не знаю с какой стороны подойти...дайте подсказку, а дальше Я Сам. =)

Добавлено через 35 минут
Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.
Это и есть решение к задаче!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>  
using namespace std;  
int main() {    
    freopen("INPUT.TXT", "r", stdin);
    freopen("OUTPUT.TXT", "w", stdout);
    int n, k = 0;
    char s1[1000];
    cin >> n;
    for(int i = 0; i < n + 1; ++i) {        
        cin.getline(s1, 1000);
        for(int j = 0; j < 999; ++j)
            if(s1[0] == 'A')            
                if(s1[j + 1] == 'A') 
                    k++;
    }
    cout << k;
    return 0;  
}
Но он у Меня ругается на 1 тест, хотя 1-й тест такой же как и в примере.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2011, 16:07     Левая рекурсия.
Посмотрите здесь:

C++ Даны числа x, y, x1, y1, x2, y2. Проверить истинность высказывания: «Точка с координатами (x, y) лежит внутри прямоугольника, левая верхняя вершина ко
Если в строке левая и правая скобки идут рядом, удалить их из строки C++
Найти 15 первых натуральных чисел, делящихся нацело 19 и находящихся в интервале , левая граница которого равна 100. C++
6.34. Найти 15 первых натуральных чисел, делящихся нацело на 19 и нахо-дящихся в интервале, левая граница которого равна 100 C++
fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка '{' C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.04.2011, 17:34     Левая рекурсия. #2
Условие запутанное, но решается элементарно.
Просто считываешь n раз строчки, если 1й символ строки совпадает с 4м, то увеличиваешь количество левых рекурсий на одну.
Если не получается, вот готовый код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int a,c=0,i;
char s[35];
scanf("%i",&a);
for (i=0; i <a; i++) {
scanf("%s",&s);
if (s[0]==s[3]) c++;
}
printf("%i",c);
return 0;}
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
24.04.2011, 18:28  [ТС]     Левая рекурсия. #3
если 1й символ строки совпадает с 4м, то увеличиваешь количество левых рекурсий на одну.
diagon, глупый вопрос, но как Вы догадались? =)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.04.2011, 18:46     Левая рекурсия. #4
Цитата Сообщение от Temirlan90 Посмотреть сообщение
Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.
Это и есть решение к задаче!!!
Ну как бы A-первый символ, R начинается с 4го символа...
Если первый символ равен четвертому(A=R), то это левая рекурсия.
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
24.04.2011, 18:56  [ТС]     Левая рекурсия. #5
Ясно...Я думал несколько иначе. Думал что количество 'A' и есть решение. С условием что первый символ 'A' =)
Yandex
Объявления
24.04.2011, 18:56     Левая рекурсия.
Ответ Создать тему
Опции темы

Текущее время: 22:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru