subroutines. Recursive procedures and functions


Task
In the alphabet of the language of the tribe "Tumba-Yumba"; four letters: "K", "L", "M" and "N". You need to display all the words consisting of n letters that can be built from the letters of this alphabet.

The problem is a normal brute-force problem that can be reduced to a smaller problem.
We will sequentially substitute letters for the word.
The first position of a word can be one of the 4 letters of the alphabet (K. L, M, N).
Let's put the letter K first. Then, in order to get all variants with the first letter K, you need to enumerate all possible combinations of letters in the remaining n - 1 positions and so on. (see picture).
Thus, the problem is reduced to solving four problems of length n - 1.
 
Iterate over n characters recursively
w[0]='K'; // iterate over the last L-1 characters w[0]='L'; // iterate over the last L-1 characters w[0]='M'; // iterate over the last L-1 characters w[0]='N'; // iterate over the last L-1 characters w - a character string that stores the working word.
Thus, we got recursion. We can arrange the solution of the problem in the form of a recursive procedure. 
It remains to determine when the recursion will end? When all characters are set, that is, the number of set characters is n. In this case, you need to display the resulting word on the screen and exit the procedure.

The C++ program will look like this.
#include<iostream> using namespace std; void TumbaWords( string A, string &w, int N ) // w - changeable parameter (string-result) // The TumbaWords procedure is passed the alphabet as a character string, // the word word and the number of characters already set (preceding – 0). { int i; if (N == w.size()) {   // if all characters have already been set to the word,     // then it is necessary to output a string and end the procedure cout << w<< endl; return; } for ( i = 1; i < A.size(); i ++ ) {   // if the condition above is false (that is, not all characters are spaced,   // then in the loop we go through all the characters of the alphabet and // alternately put the character on the first free space w[N] = A[i]; TumbaWords ( A, w, N+1 ); } } main() { intn; stringword; intn; cin>> n; word.resize(n); // increase string to size n TumbaWords( "KLMN", word, 0 ); }
NOTE that w is a mutable parameter (result string)!