/*   1    2    3    4    5    6
1    1
2    1    1
3    1    2    1
4    1    3    3    1
5    1    4    6    4    1
6    1    5   10   10    5    1

通过观察以上可知,杨辉三角第一行只有一个数为1
第二行则有两个数也分别为1
第三行开始,如果不是第一列或者行数等于列数的情况,则是相应的i行j列的数等于i-1行j-1列的数与i-1行j列的数之和
由此可想到递归,即自身调用自身的情况
*/
#include<stdio.h>
int returnNum(int i,int j)//设置一个数,用来返回杨辉三角各个位置所存放的数
{
    if(j==0||i==j)//如果是第一列或者行数和列数相等,则返回1
        return 1;
    else
        return returnNum(i-1,j-1)+returnNum(i-1,j);//这里体现了递归寻找杨辉三角的数
}
int main(void)
{
    int n;
    int **num;
    scanf("%d",&n);
    num=(int **)malloc(sizeof(int *)*n);
    for(int i=0;i<n;i++)
        num[i]=(int *)malloc(sizeof(int)*n);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)//每个数的列数都不能超过行数
        {
            num[i][j]=returnNum(i,j);
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            printf("%5d",num[i][j]);
        }
        printf("\n");
    }
    return 0;
}