杨辉三角又名Pascal三角。其结构存储在一个二维数组里可以当成一个下三角矩阵。
其核心是 每行的行首元素和对角线元素(行列坐标相等)的情况下存储数字1,其它情况下为其腰上的两个元素之和。下面我们就从循环和递归两种方法打印杨辉三角。
1.循环,唯一遇到的困难就是二维数组传参,我为了简便,用了全局变量!
#include <stdio.h>
int a[10][10];
void cyanghui(int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0 || j == i)
a[i][j] = 1;
else
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
}
}
}
void printyanghui(int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j <= i; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
int main(void)
{
printf("Inputer YangHui triangle's size(<11):");
int size;
scanf("%d", &size);
cyanghui(size);
printf("Output:\n");
printyanghui(size);
return 0;
}
运行结果(下三角形):
2.递归
我们还是按照那个思路来:
先分析简单情况,就是行首和行列相等时返回1,函数中止。
就是上面双重循环里if情况
否则就求其腰上的两个元素之和,其腰上的两个元素要么为1,要么等于它们腰上的数之和,这就产生了一般规律。
代码如下:
#include <stdio.h>
int yanghui(int i, int j)
{
if(j == 0 || i == j)
return 1;
return yanghui(i - 1, j - 1) + yanghui(i - 1, j);
}
int main(void)
{
printf("Please input Pascal Triangle's rows:");
int row;
scanf("%d", &row);
printf("\nThere are %d rows Pascal Triangle will be output:\n", row);
int a[20][20];
int i, j, k;
for (i = 0; i < row; i++)
for (j = 0; j <= i; j++)
a[i][j] = yanghui(i, j);
for (i = 0; i < row; i++)
{
for (k = row - i + 7; k > 0; k--)
{
printf(" ");
}
for (j = 0; j <= i; j++)
{
printf("%d ", a[i][j]);
}
printf("\n\n");
}
return 0;
}
测试输出(这次我们修改了一下输出格式,“腰上”更加看得清晰):
我们可以看到,递归函数相当简洁。如果有递推式子,写起递归代码来更加得心应手。