#include <stdio.h>
int main()
{
    int r,c, n,nr,nc,c1=1,c2=1;
    scanf("%d", &n);
    nr=2*n-1;
    nc=2*n-1;
    for(r=1;r<=nr;r++)
    {
        for(c=1;c<=nc;c++)
        {
            if(c<c1||c>c2)
                printf(" ");
            else
                printf("*");
        }
        if(r<n)
        {
            c1++;
            c2=c2+2;
        }
        else
        {
            c1--;
            c2=c2-2;
        }
        printf("\n");
    }
}
Consider a nested loop as shown above.. 
First i tried converting inner c loop into recursion and i got this code below
#include <stdio.h>
void loop(int c,int nc,int c1,int c2)
{
    if(c>nc)
        return;
    if(c<c1||c>c2)
        printf(" ");
    else
        printf("*");
    loop(c+1,nc,c1,c2);
}
int main()
{
    int r,c, n,nr,nc,c1=1,c2=1;
    scanf("%d", &n);
    nr=2*n-1;
    nc=2*n-1;
    for(r=1;r<=nr;r++)
    {
        loop(1,nc,c1,c2);
        if(r<n)
        {
            c1++;
            c2=c2+2;
        }
        else
        {
            c1--;
            c2=c2-2;
        }
        printf("\n");
    }
}
Now further converting outer r loop the program would like this as shown below
#include <stdio.h>
void loop(int c,int nc,int c1,int c2)
{
    if(c>nc)
        return;
    if(c<c1||c>c2)
        printf(" ");
    else
        printf("*");
    loop(c+1,nc,c1,c2);
}
void pattern(int r,int n,int c1,int c2)
{
    if(r>2*n-1)
        return;
    loop(1,2*n-1,c1,c2);
    if(r<n)
    {
        c1++;
        c2=c2+2;
    }
    else
    {
        c1--;
        c2=c2-2;
    }
    printf("\n");
    pattern(r+1,n,c1,c2);
}
int main()
{
    int r,c, n,nr,nc,c1=1,c2=1;
    scanf("%d", &n);
    nr=2*n-1;
    nc=2*n-1;
    pattern(1,n,c1,c2);
}
Further can be improved as
#include <stdio.h>
void loop(int c,int nc,int c1,int c2)
{
    if(c>nc)
        return;
    if(c<c1||c>c2)
        printf(" ");
    else
        printf("*");
    loop(c+1,nc,c1,c2);
}
void pattern(int r,int n,int c1,int c2)
{
    if(r>2*n-1)
        return;
    loop(1,2*n-1,c1,c2);
    if(r<n)
    {
        printf("\n");
        pattern(r+1,n,c1+1,c2+2);
    }
    else
    {
        printf("\n");
        pattern(r+1,n,c1-1,c2-2);
    }
}
int main()
{
    int r,c, n,nr,nc,c1=1,c2=1;
    scanf("%d", &n);
    nr=2*n-1;
    nc=2*n-1;
    pattern(1,n,c1,c2);
}
No comments:
Post a Comment