c中使用递归函数的星形模式



我正在尝试开发一个C代码,通过给定的输入生成*模式。首先,它必须打印恒星下降2,然后再上升2。类似:

输入

enter number: 8

输出

********
******
****
**
****
******
********

以下是我目前所做的:

#include <stdio.h>
int printpattern(int n){
if(n==0)return 0;
printf("*");
printpattern(n-1);
}
int pattern(int n){
if(n==0)return 0;
puts("n");
printpattern(n);
pattern(n-2);
}
int main(){
int n;
puts("number: ");
scanf("%d", &n);
if(n%2==1){
puts("must be even");
main();
}
pattern(n);
return 0;
}

谢谢。。

递归调用函数main将导致在每次调用主时执行这些语句

puts("number: ");
scanf("%d", &n);

所以递归调用main不是一个好主意。

我会按照下面的演示程序所示的方式编写函数。

#include <stdio.h>
void print_pattern( unsigned int n )
{
if ( n )
{
putchar( '*' );
print_pattern( n - 1 );
}
}
void pattern( unsigned int n )
{
if ( n )
{
print_pattern( n );
putchar( 'n' );

if ( n > 2 )
{
pattern( n - 2 );
print_pattern( n );
putchar( 'n' );
}
}
}

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' );

pattern( n );

putchar( 'n' );
}

return 0;
}

程序输出可能看起来像

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

当然,你只能对偶数调用函数,尽管函数更通用,可以对任何非负数调用。

函数本身不应该依赖于传递给它的是偶数还是奇数

我认为,如果问题指出必须使用递归,那么以这种方式使用递归更有意义:

#include <stdio.h>
static void printstars(int n)
{
for (int i = 0; i < n; i++) {
printf("*");
}
printf("n");
}
static void printpattern(int n)
{
printstars(n);
if (n > 4) {
printpattern(n - 2);
} else {
printstars(2);
}
printstars(n);
}
int main(void)
{
int n;
puts("number: ");
scanf("%d", &n);
if (n & 1) {
fprintf(stderr, "must be evenn");
return 1;
}
printpattern(n);
return 0;
}

最新更新