求解,如何用递归来做

img


刚学c语言,数字金字塔用循环会做,但用递归却没有思路,希望各位指点

void print(int n)
{
    int  j = n - 1, k = 1;        // j表示每层的空格数,k表示层数
    for(;k <= n; k++)
    {
        printf("%*s", j--,"");        // 输出空格
        int i = 1;
        while (i < 2 * k) printf("%d", i++);    // 输出数字
        puts("");
    }

}

void print2(int n)
{
    int  i = 0;        // i表示层数
    char ch = '\0';
    char str[] = "123456789";    // 根据实际需求定义长度
    while(i++ < n)
    {
        swap(str[i * 2 - 1], ch);
        printf("%*s\n", i + n - 1, str);
        swap(str[i * 2 - 1], ch);
        /* // 不使用swap函数
        ch = str[i*2-1];
        str[i*2-1] = '\0';
        printf("%*s\n", i + n - 1, str);
        str[i*2-1] = ch;
        */
    }

}

// 递归
void PrintNum(int n)
{
    if(n > 1) PrintNum(n - 1);
    char str[] = "123456789";    // 根据实际需求定义长度
    str[2 * n -1] = '\0';
    printf("%*s\n", n+4, str);
}

int main()
{
    print(5);    puts("");
    print2(5);    puts("");
    PrintNum(5);puts("");    
    return 0;
}




//输出前导空格
void space(int n)
{
    if (n == 0)
        return;
    printf(" ");
    space(n - 1);
}

//输出列,n=0递减
void fun1(int inx, int n)
{
    if (inx == n)
        return;
    printf("%d", inx);
    if (n != 0)
        fun1(inx + 1, n);
    else
        fun1(inx - 1, 0);
}

//输出行
void fun(int inx, int n)
{
    if (inx > n)
        return;
    space(n - inx); //空格
    fun1(1, inx);   //递增
    fun1(inx, 0);   //递减
    printf("\n");
    fun(inx + 1, n); //下一行
}

int main()
{
    int i, j, k, n = 5;
    fun(1, n);

    return 0;
}