Рекурсия — это просто хитрый способ вложения четырех циклов for
. Вот как выглядит код
#include <stdio.h>
void sneaky( int depth, int maxDepth, char str[] )
{
char c, start;
start = 'a' + depth * 3;
for ( c = start; c < start + 3; c++ )
{
str[depth] = c;
str[depth+1] = '\0';
if ( depth == maxDepth )
printf( "%s\n", str );
else
sneaky( depth + 1, maxDepth, str );
}
}
int main( void )
{
char str[5] = { 0 };
sneaky( 0, 3, str );
}
Вы также можете решить эту задачу и подобные комбинаторные задачи с помощью простого алгоритма подсчета. Алгоритм счета имитирует естественный счет, при котором вы увеличиваете младшую значащую цифру от 0 до 9. Когда младшая значащая цифра переходит от 9 обратно к 0, увеличивается следующая цифра слева.
То же самое можно сделать, чтобы решить проблему ОП. Но в этом случае цифры имеют либо два, либо три возможных значения. И если вы изучите шаблон в OP, то сразу станет ясно, что младшая значащая цифра находится слева. В шаблоне
adgj
bdgj
cdgj
aegj
видно, что a
становится b
, b
становится c
, а когда c
возвращается к a
, d
становится e
.
Вот код
#include <stdio.h>
#include <stdlib.h>
static char InitialValue[] = { 'y', 'a', 'd', 'g', 'j', 'm', 'p', 's', 'u', 'w' };
static char NextValue[] = { 'b', 'c', 'a', 'e', 'f', 'd', 'h', 'i', 'g',
'k', 'l', 'j', 'n', 'o', 'm', 'q', 'r', 'p',
't', 's', 'v', 'u', 'x', 'w', 'z', 'y' };
static void error( char *msg )
{
fprintf( stderr, "%s\n", msg );
exit( EXIT_FAILURE );
}
int main( void )
{
int i, oldDigit;
char str[12];
// get the input string from the user
printf( "Enter the input string: " );
fflush( stdout );
if ( scanf( "%10s", str ) != 1 )
error( "whatever" );
// convert the input string to the corresponding first output string
for ( i = 0; str[i] != '\0'; i++ )
{
if ( str[i] < '0' || str[i] > '9' )
error( "invalid input string" );
str[i] = InitialValue[str[i] - '0'];
}
printf( "%s\n", str );
// use a simple counting algorithm to generate the string combinations
for (;;)
{
for ( i = 0; str[i] != '\0'; i++ )
{
oldDigit = str[i]; // save the current digit
str[i] = NextValue[oldDigit - 'a']; // advance the digit to the next value
if ( str[i] > oldDigit ) // if the digit did not wrap
break; // then we've got a new string
}
if ( str[i] == '\0' ) // if all the digits wrapped
break; // then we're done
printf( "%s\n", str ); // output the new string
}
return( EXIT_SUCCESS );
}
person
user3386109
schedule
15.11.2014
recfn (index + 1)
или тому подобное). Во вложенных циклах гораздо проще отловить проблемы отладки. Хотя преимуществом рекурсии является то, что она приведет к более глубокому знакомству сgdb
раньше, а не позже. - person David C. Rankin   schedule 16.11.2014