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

Posted

技术标签:

【中文标题】在c中使用递归函数的星形模式【英文标题】:star pattern using recursive func in c 【发布时间】:2022-01-01 09:34:04 【问题描述】:

我正在尝试开发一个通过给定输入生成 * 模式的 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;

谢谢..

【问题讨论】:

您的代码格式错误,因此无法读取。你应该告诉我们你得到了什么输出以及问题是什么(不仅仅是“为我完成我的程序”)。您显然需要一个从 n 倒数到 1 或 2 的循环,打印最小值,然后再次返回到 n。如果你愿意,你也可以递归而不是循环。 永远不要从你的程序中调用main 请勿使用scanf 输入参数。 main 有 2 个参数,你应该在那里传递参数(即,作为启动程序时的参数)。 【参考方案1】:

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

#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 even\n");
        return 1;
    
    printpattern(n);
    return 0;

【讨论】:

【参考方案2】:

递归调用main函数会导致每次调用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

当然你可以只为偶数调用该函数,尽管该函数更通用并且可以为任何非负数调用。

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

【讨论】:

以上是关于在c中使用递归函数的星形模式的主要内容,如果未能解决你的问题,请参考以下文章

main函数可否进行递归调用

c语言怎么用递归调用函数的方法求n的阶乘?

c语言函数递归相关知识及应用

C语言的两个问题: 所有的递归程序均可以用非递归算法实现?递归函数中的形式参数是自动变量吗? c语言中

C语言编程:用函数递归法求Fibonacci数列的前n项·

C语言-第36课 - 函数递归与函数设计技巧