【问题标题】:star pattern using recursive func in c在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 个参数,你应该在那里传递参数(即,作为启动程序时的参数)。

标签: c recursion


【解决方案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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2013-07-16
      • 2022-11-25
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多