0 / 0 / 0
Регистрация: 23.07.2022
Сообщений: 2
1

Рекурсия. Вывести на экран все слова из k букв, в которых буква Ы встречается больше 1 раза и посчитать их кол-во.

23.07.2022, 13:06. Показов 1414. Ответов 7

Author24 — интернет-сервис помощи студентам
Алфавит языка племени "тумба-юмба" состоит из букв Ы, Ц, Щ и О. Число k вводится с клавиатуры.

1) Вывести на экран все слова из k букв, в которых буква Ы встречается больше 1 раза и посчитать их кол-во.

2) Вывести на экран все слова из k букв, в которых есть одинаковые буквы, стоящие рядом и посчитать их кол-во.

Пж помогите, за рекурсию не шарю от слова совсем)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2022, 13:06
Ответы с готовыми решениями:

Вывести на экран все слова из К букв, в которых буква Ы встречается более 1 раза, и подсчитать их количество
1)Алфавит языка племени "тумба-юмба" состоит из букв Ы, Ц, Щ и О. Число K вводится с клавиатуры....

Вывести на экран все слова из mбукв, в которых буква A встречается более 1 раза
Алфавит состоит из букв A, B, C и D. Число M вводится с клавиатуры. 1. Вывести на экран все...

Выведите на экран все слова из К букв, в которых буква "Ы" встречается более 1 раза, и подсчитайте их количество
Выведите на экран все слова из К букв, в которых буква "Ы" встречается более 1 раза, и подсчитайте...

В паскале выведите на экран все слова из К букв,в которых буква "Ы" встречается более 1 раза,и подсчитайте их количество
Алфавит языка племени "тумба-юмба" состоит из букв Ы, Ц, Щ и О. Число K вводится с клавиатуры.В...

Вывести на экран слова, в которых введенная буква встречается не более 1 раза
С++ Есть файл со словами С клавиатуры вводится буква Вывести на экран самое длинное слово, в...

7
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
23.07.2022, 15:12 2
выводит все слова из k букв
C++
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
#include <iostream>
#include <string>
#include <cstdlib>
 
std::string sabc{ "ЫЦЩО" }, sres;
 
void f(int const rd)
{
    if (rd)
    {
        for (auto const c : sabc)
        {
            sres.push_back(c);
            f(rd - 1);
            sres.pop_back();
        }
    }
    else
    {
        std::cout << sres << "\n";
    }
}
 
int main()
{
    system("chcp 1251 > 0");
    int k = 2;
    f(k);
}
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
23.07.2022, 15:24 3
C++
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
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
    int  k=5;
    queue<string> words;
    words.push("");
    while (words.front().size()<k) {
        string word = words.front();
        words.pop();
        words.push(word + 'Y');
        if (2 - count(word.cbegin(), word.cend(), 'Y') < k - word.size()) {
            words.push(word + 'C');
            words.push(word + 'S');
            words.push(word + 'O');
        }
    }
    while (!words.empty()) {
        cout << words.front() << endl;
        words.pop();
    }
    return 0;
}
C++
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
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
    int  k = 5;
    queue<string> words;
    words.push("");
    while (words.front().size() < k) {
        string word = words.front();
        words.pop();
        if (word.size() == k - 2) {
            char prev = 0;
            bool has_double;
            for (char letter: word) {
                if (has_double = (letter == prev)) break;
                prev = letter;
            }
            if (!has_double) {
                words.push(word + word.back());
                continue;
            }
        }
        for (char letter: "YCSO")
            if (letter) words.push(word + letter);
    }
    while (!words.empty()) {
        cout << words.front() << endl;
        words.pop();
    }
    return 0;
}
0
4764 / 2574 / 892
Регистрация: 29.11.2010
Сообщений: 5,562
23.07.2022, 16:27 4
Смысл примерно такой:
Если алфавит имеет мощность power, то количество слов длинной length будет power^length.
Каждый уникальный идентификатор слова можно представить как число в power-ричной системе счисления.
Дальше работаем со словом как с power-ричным числом.
Ограничение -- power^length <= std::numeric_limist<std::size_t>::max().
Правда считать до std::numeric_limist<std::size_t>::max() на современных 64 битных системах придется о-о-очень долго.

C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <cmath>
 
// функция, генерирующая все слова длинной length из алфавита alphabet
// вызывающая для каждого слова функцию visit
template<typename Visitor>
void generate(std::size_t length, const std::string &alphabet, Visitor visit) {
    std::size_t power = alphabet.length(); // мощность алфавита
    std::size_t count = std::pow(power, length);
    for (std::size_t current = 0; current < count; ++current) {
        visit(current);
    }
}
 
// функция переводящая в строку слово word длинною length с алфавитом alphabet
std::string toString(std::size_t word, std::size_t length, const std::string alphabet) {
    std::size_t power = alphabet.size();
    std::string result;
    for (std::size_t i = 0; i < length; ++i) {
        result += alphabet[word % power];
        word /= power;
    }
    return result;
}
 
// встречается ли в слове word длиной length с алфавитом мощностью power символ с номером symbol
bool hasMultiple(std::size_t word, std::size_t length, std::size_t power, std::size_t symbol) {
    bool foundSymbol = false;
    for (std::size_t i = 0; i < length; ++i) {
        if (symbol == word % power) {
            if (foundSymbol) {
                return true;
            }
            foundSymbol = true;
        }
        word /= power;
    }
    return false;
}
 
// встречается ли в слове word длиной length с алфавитом мощностью power одинаковые символы, идущие подряд
bool hasConsequentSymbols(std::size_t word, std::size_t length, std::size_t power) {
    bool previousSymbol = word % power;
    for (std::size_t i = 1; i < length; ++i) {
        word /= power;
        std::size_t thisSymbol = word % power;
        if (previousSymbol == thisSymbol) {
            return true;
            previousSymbol = thisSymbol;
        }
    }
    return false;
}
 
int main() {
    std::string alphabet = "SWOJ"; // алфавит
    std::size_t power = alphabet.size(); // мощность алфавита
    std::size_t length; // длина слов
    std::cin >> length;
 
    std::size_t symbol = 0; // позиция заданного символа в алфавите
    std::size_t countMultipleSymbol = 0; // количество слов, содержащих боле одного заданного символа
    // функция, выводящая слова с более чем одним вхождением символа symbol
    // и считающая их колчиество
    std::cout << "Words with more than one '" << alphabet[symbol] << "':\n";
    auto countHasMultipleY = [&countMultipleSymbol, &alphabet, &power, &length, &symbol](std::size_t word) {
        if (hasMultiple(word, length, power, symbol)) {
            std::cout << toString(word, length, alphabet) << std::endl;
            ++countMultipleSymbol;
        }
    };
    generate(length, alphabet, countHasMultipleY);
    std::cout << "Count is " << countMultipleSymbol << "\n";
 
    std::size_t countConsequentSymbols = 0; // количество слов с идущими подряд символами
    std::cout << "Words with consequent symbols:\n";
    auto countHasConsequentSymbols = [&countConsequentSymbols, &alphabet, &power, &length](std::size_t word) {
        if (hasConsequentSymbols(word, length, power)) {
            std::cout << toString(word, length, alphabet) << std::endl;
            ++countConsequentSymbols;
        }
    };
    generate(length, alphabet, countHasConsequentSymbols);
    std::cout << "Count is " << countConsequentSymbols << "\n";
 
}
Можно еще посчитать количество банальной комбинаторикой, убрать фактический подсчёт и значительно упростить код.
Но не думаю, что это смысл задания. )))
0
0 / 0 / 0
Регистрация: 23.07.2022
Сообщений: 2
24.07.2022, 04:02  [ТС] 5
рекурсия....
0
4764 / 2574 / 892
Регистрация: 29.11.2010
Сообщений: 5,562
24.07.2022, 11:40 6
Цитата Сообщение от Voyt Посмотреть сообщение
рекурсия....
C++
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <cmath>
 
// рекурсия вместо цикла
template<typename Visitor>
void recursiveTraverse(std::size_t n, Visitor visit) {
    if (n > 0) {
        visit(n);
        recursiveTraverse(n - 1, visit);
    }
}
 
// функция, генерирующая все слова длинной length из алфавита alphabet
// вызывающая для каждого слова функцию visit
template<typename Visitor>
void generate(std::size_t length, const std::string &alphabet, Visitor visit) {
    std::size_t power = alphabet.length(); // мощность алфавита
    std::size_t count = std::pow(power, length);
    recursiveTraverse(count, visit);
}
 
// функция переводящая в строку слово word длинною length с алфавитом alphabet
std::string toString(std::size_t word, std::size_t length, const std::string alphabet) {
    std::size_t power = alphabet.size();
    std::string result;
    for (std::size_t i = 0; i < length; ++i) {
        result += alphabet[word % power];
        word /= power;
    }
    return result;
}
 
// встречается ли в слове word длиной length с алфавитом мощностью power символ с номером symbol
bool hasMultiple(std::size_t word, std::size_t length, std::size_t power, std::size_t symbol) {
    bool foundSymbol = false;
    for (std::size_t i = 0; i < length; ++i) {
        if (symbol == word % power) {
            if (foundSymbol) {
                return true;
            }
            foundSymbol = true;
        }
        word /= power;
    }
    return false;
}
 
// встречается ли в слове word длиной length с алфавитом мощностью power одинаковые символы, идущие подряд
bool hasConsequentSymbols(std::size_t word, std::size_t length, std::size_t power) {
    bool previousSymbol = word % power;
    for (std::size_t i = 1; i < length; ++i) {
        word /= power;
        std::size_t thisSymbol = word % power;
        if (previousSymbol == thisSymbol) {
            return true;
            previousSymbol = thisSymbol;
        }
    }
    return false;
}
 
int main() {
    std::string alphabet = "SWOJ"; // алфавит
    std::size_t power = alphabet.size(); // мощность алфавита
    std::size_t length; // длина слов
    std::cin >> length;
 
    std::size_t symbol = 0; // позиция заданного символа в алфавите
    std::size_t countMultipleSymbol = 0; // количество слов, содержащих боле одного заданного символа
    // функция, выводящая слова с более чем одним вхождением символа symbol
    // и считающая их колчиество
    std::cout << "Words with more than one '" << alphabet[symbol] << "':\n";
    auto countHasMultipleY = [&countMultipleSymbol, &alphabet, &power, &length, &symbol](std::size_t word) {
        if (hasMultiple(word, length, power, symbol)) {
            std::cout << toString(word, length, alphabet) << std::endl;
            ++countMultipleSymbol;
        }
    };
    generate(length, alphabet, countHasMultipleY);
    std::cout << "Count is " << countMultipleSymbol << "\n";
 
    std::size_t countConsequentSymbols = 0; // количество слов с идущими подряд символами
    std::cout << "Words with consequent symbols:\n";
    auto countHasConsequentSymbols = [&countConsequentSymbols, &alphabet, &power, &length](std::size_t word) {
        if (hasConsequentSymbols(word, length, power)) {
            std::cout << toString(word, length, alphabet) << std::endl;
            ++countConsequentSymbols;
        }
    };
    generate(length, alphabet, countHasConsequentSymbols);
    std::cout << "Count is " << countConsequentSymbols << "\n";
 
}
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
24.07.2022, 11:56 7
igorrr37, и зачем это тут
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
24.07.2022, 13:15 8
Kuzia domovenok, ограничения сам сделает. Он же написал что не шарит за рекурсию. Может ещё и ввод инта прописать а то вдруг бедняга не осилит
0
24.07.2022, 13:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2022, 13:15
Помогаю со студенческими работами здесь

Рекурсия: вывести на экран все возможные слова, состоящие из К букв, в которых вторая буква "Ы"
В алфавите языке племени &quot;тумба-юмба&quot; четыре буквы: &quot;Ы&quot;, &quot;Ш&quot;, &quot;Ч&quot; и &quot;О&quot;. Нужно вывести на экран...

Найти в строке все слова, в которых каждая буква встречается более одного раза, и вывести слова по алфавиту
Всем доброго вечера!Помогите пожалуйста!Не могу ни создать,ни найти программу( Вот задание: Найти...

Вывести все слова длиной L символов, в которых буква Ы встречается более 1 раза
Выведите на экран все слова длиной L символов, в которых буква Ы встречается более 1 раза, и...

Вывести на экран все возможные слова, состоящие из K букв, в которых вторая буква Ы
В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все...

Все слова, в которых буква “а” встречается более 2-х раз, удалить из текста. Вывести полученную строку на экран. Если та
Можете помочь объяснить алгоритм решения? я как понял строку сплитом разделять,а как дальше...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru