Module: 서브루틴. 재귀


Problem

11/12

여러 줄 반복

Theory Click to read/hide

과제
Tumba-Yumba 부족 언어의 알파벳으로; 네 글자: "K", "L", "M" 및 "N". 이 알파벳의 문자로 만들 수 있는 n개의 문자로 구성된 모든 단어를 표시해야 합니다.

문제는 더 작은 문제로 축소될 수 있는 일반적인 무차별 대입 문제입니다.
단어를 순차적으로 문자로 대체합니다.
단어의 첫 번째 위치는 알파벳 4자(K. L, M, N) 중 하나일 수 있습니다.
문자 K를 먼저 넣겠습니다. 그런 다음 첫 번째 문자 K가 있는 모든 변형을 가져오려면 나머지 n - 1 위치 등에서 문자의 가능한 모든 조합을 열거해야 합니다. (그림 참조).
따라서 문제는 길이가 n - 1인 네 가지 문제를 해결하는 것으로 축소됩니다.
 
n자를 재귀적으로 반복
w[0]='K';; // 마지막 L-1 문자를 반복합니다. w[0]='L';; // 마지막 L-1 문자를 반복합니다. w[0]='M';; // 마지막 L-1 문자를 반복합니다. w[0]='N'; // 마지막 L-1 문자를 반복합니다. w - 작업 단어를 저장하는 문자열.
따라서 우리는 재귀를 얻었습니다. 재귀 절차의 형태로 문제의 해결책을 마련할 수 있습니다. 
재귀가 언제 끝날지 결정하는 것이 남아 있습니까? 모든 문자가 설정된 경우, 즉 설정된 문자의 수는 n입니다. 이 경우 결과 단어를 화면에 표시하고 절차를 종료해야 합니다.

C# 프로그램은 다음과 같습니다.
<사업부> // w - 변경 가능한 매개변수(문자열 결과) // TumbaWords 프로시저는 알파벳을 문자열로 전달하고, // 단어 단어와 이미 설정된 문자 수(처음에 – 0) 정적 무효 TumbaWords( 문자열 A, 참조 문자열 w, int N ) { if (N == w.Length) // w.Length - 문자열의 문자 수 {   // 모든 문자가 이미 해당 단어로 설정된 경우       // 그런 다음 문자열을 출력하고 프로시저를 종료해야 합니다. Console.WriteLine(w); 반품; } for ( int i = 0; i < w.Length; i ++ ) // 위의 조건이 거짓인 경우(즉, 모든 문자가 간격을 두지 않고, {     // 위의 조건이 false인 경우(즉, 모든 문자가 공백이 아닌 경우     // 그런 다음 루프에서 알파벳의 모든 문자를 살펴보고   // 번갈아 가며 첫 번째 여유 공간에 문자를 놓습니다. w += A[i]; TumbaWords(A, ref w, N+1); w = w.Remove(w.Length - 1); // 그런 다음 마지막으로 추가된 문자를 제거합니다.   // 동일한 접두사를 가진 새 단어를 만들기 위해 } } 정적 무효 메인() { int n = Convert.ToInt32(Console.ReadLine()); 문자열 단어 = "";; TumbaWords("KLMN", 참조 단어, 0); }
참고 w는 변경 가능한 매개변수(결과 문자열)입니다!

Problem

"tumba-yumba" 부족 언어의 알파벳으로; 네 글자: "K", "L", "M" 및 "N". 이 알파벳의 문자로 만들 수 있는 n개의 문자로 구성된 모든 단어를 표시해야 합니다.
(c) 케이유. 폴리야코프