给你。
#include
void draw_hourglass_rec_helper( unsigned int n, int offset )
{
const char c = '*';
if ( n )
{
printf( "%*c", offset + 1, c );
unsigned int k = n % 2 == 0 ? n - 1 : n;
for ( unsigned int i = 0; i < k - 1; i++ ) putchar( c );
putchar( '\n' );
if ( ! ( n < 2 ) ) draw_hourglass_rec_helper( n - 2, offset + 1 );
if ( n != 1 )
{
printf( "%*c", offset + 1, c );
for ( unsigned int i = 0; i < k - 1; i++ ) putchar( c );
putchar( '\n' );
}
}
}
void draw_hourglass_rec( unsigned int n )
{
if ( n )
{
draw_hourglass_rec_helper( n, 0 );
}
}
int main(void)
{
while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );
unsigned int n;
if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
putchar( '\n' );
draw_hourglass_rec( n );
putchar( '\n' );
}
return 0;
}
程序输出可能看起来像
Enter a non-negative number (0 - exit): 10
*********
*******
*****
***
*
*
***
*****
*******
*********
Enter a non-negative number (0 - exit): 9
*********
*******
*****
***
*
***
*****
*******
*********
Enter a non-negative number (0 - exit): 8
*******
*****
***
*
*
***
*****
*******
Enter a non-negative number (0 - exit): 7
*******
*****
***
*
***
*****
*******
Enter a non-negative number (0 - exit): 6
*****
***
*
*
***
*****
Enter a non-negative number (0 - exit): 5
*****
***
*
***
*****
Enter a non-negative number (0 - exit): 4
***
*
*
***
Enter a non-negative number (0 - exit): 3
***
*
***
Enter a non-negative number (0 - exit): 2
*
*
Enter a non-negative number (0 - exit): 1
*
Enter a non-negative number (0 - exit): 0
如果helper函数的第二个参数应该是unsigned int类型,那么可以使用循环来输出初始空格,例如
void draw_hourglass_rec_helper( unsigned int n, unsigned int offset )
{
const char c = '*';
if ( n )
{
for ( unsigned int i = 0; i < offset; i++ ) putchar( ' ' );
unsigned int k = n % 2 == 0 ? n - 1 : n;
for ( unsigned int i = 0; i < k; i++ ) putchar( c );
putchar( '\n' );
if ( ! ( n < 2 ) ) draw_hourglass_rec_helper( n - 2, offset + 1 );
if ( n != 1 )
{
for ( unsigned int i = 0; i < offset; i++ ) putchar( ' ' );
for ( unsigned int i = 0; i < k; i++ ) putchar( c );
putchar( '\n' );
}
}
}
另一种方法是使用静态变量作为输出偏移量,而不是使用helper函数。
#include
void draw_hourglass_rec( unsigned int n )
{
static int offset = 0;
const char c = '*';
if ( n )
{
++offset;
printf( "%*c", offset, c );
unsigned int k = n % 2 == 0 ? n - 1 : n;
for ( unsigned int i = 0; i < k - 1; i++ ) putchar( c );
putchar( '\n' );
if ( ! ( n < 2 ) ) draw_hourglass_rec( n - 2 );
if ( n != 1 )
{
printf( "%*c", offset, c );
for ( unsigned int i = 0; i < k - 1; i++ ) putchar( c );
putchar( '\n' );
}
--offset;
}
}
int main(void)
{
while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );
unsigned int n;
if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
putchar( '\n' );
draw_hourglass_rec( n );
putchar( '\n' );
}
return 0;
}