Sign in
or
Register
Courses
Textbook
Compiler
Contests
Topics
Courses
C#. Fundamentos
sub-rotinas. recursão
Module:
sub-rotinas. recursão
Problem
11
/12
Iterando sobre as linhas
Theory
Click to read/hide
Tarefa
No alfabeto da língua da tribo "Tumba-Yumba"; quatro letras: "K", "L", "M" e "N". Você precisa exibir todas as palavras que consistem em
n
letras que podem ser construídas a partir das letras deste alfabeto.
O problema é um problema normal de força bruta que pode ser reduzido a um problema menor.
Substituiremos sequencialmente as letras da palavra.
A primeira posição de uma palavra pode ser uma das 4 letras do alfabeto (K. L, M, N).
Vamos colocar a letra
K
primeiro. Então, para obter todas as variantes com a primeira letra
K
, você precisa enumerar todas as combinações possíveis de letras nas posições
n - 1
restantes e assim por diante. (veja a foto).
Assim, o problema se reduz a resolver quatro problemas de comprimento
n - 1
.
Iterar sobre n caracteres recursivamente
w[0]='K'; // itera sobre os últimos caracteres L-1 w[0]='L'; // itera sobre os últimos caracteres L-1 w[0]='M'; // itera sobre os últimos caracteres L-1 w[0]='N'; // itera sobre os últimos caracteres L-1
w
- uma cadeia de caracteres que armazena a palavra de trabalho.
Assim, temos
recursão.
Podemos organizar a solução do problema na forma de um procedimento recursivo.
Resta determinar quando a recursão terminará? Quando todos os caracteres são definidos, ou seja, o número de caracteres definidos é
n
. Nesse caso, você precisa exibir a palavra resultante na tela e sair do procedimento.
O programa C# ficará assim.
//
w - parâmetro alterável
(string-result) // O procedimento TumbaWords recebe o alfabeto como uma string de caracteres, // a palavra word e o número de caracteres já definidos (no início – 0) static void TumbaWords( string A, ref string w, int N ) { if (N == w.Length) // w.Length - o número de caracteres na string { // se todos os caracteres já tiverem sido definidos para a palavra, // então é necessário enviar uma string e terminar o procedimento Console.WriteLine(w); retornar; } for ( int i = 0; i < w.Length; i ++ ) // se a condição acima for falsa (ou seja, nem todos os caracteres são espaçados, { // se a condição acima for falsa (isto é, nem todos os caracteres são espaçados, // então no loop passamos por todos os caracteres do alfabeto e // coloca alternadamente o caractere no primeiro espaço livre w += A[i]; TumbaPalavras(A, ref w, N+1); w = w.Remove(w.Length - 1); // e, em seguida, remova o último caractere adicionado, // para criar uma nova palavra com o mesmo prefixo } } static void Main() { int n = Convert.ToInt32(Console.ReadLine()); string palavra = ""; TumbaWords("KLMN", ref word, 0); }
OBSERVE
que
w
é um parâmetro mutável (string de resultado)!
Problem
No alfabeto da língua da tribo «tumba-yumba» quatro letras: "K", "L", "M" e "N". Você precisa exibir todas as palavras que consistem em
n
letras que podem ser construídas a partir das letras deste alfabeto.
(c) K.Yu. Polyakov
1000
ms
256 Mb
Rules for program design and list of errors in automatic problem checking
Teacher commentary