说到杨辉三角形相信学过数学的人都不会陌生这一个数学模型;
但是看起来简单但是用代码形式写出来就有点不知所措,相信总有人跟我一样第一次遇见这种题目,也是无从下手,我也是花了点时间解决这道题,心里也小喜悦,也是想和大家分享一下,接下来讲解可能会有一些地方讲的不对地方,欢迎大家指出来。
就让我们回忆回忆一下这个杨辉三角形吧。
i=0 1
i=1 1 1
i=2 1 2 1
i=3 1 3 3 1
i=4 1 4 6 4 1
i=5 1 5 10 10 5 1
j= 0 1 2 3 4 5
这图画的有点抽象,将就点看吧,我们看杨辉三角形是不是像一个等腰三角形,,然后我们发现这个这个等腰三角形的两边全是1,然后我们又接着发现从i=2这一行开始中间数等于上一行相邻两数相加,可能这句话不太好理解我就换一个用二维数组知识来解释一下这个意思,我们假设定义一个二维数组 int arr[2][2]不能看出这个指向数字2,(中间数等于上一行相邻两数相加)不就是等价于
arr[2][2]= arr[1][0]+arr[1][1],然后我们发现这个总结一下不就等价于arr[i][j]=arr[i-1][j-1]+arr[i-1][j],
然后我们继续分析一下等腰两边全1,我们自己在纸上用笨办法用二维数组写出1所在的位置,不难发现 j下标为0和(j=i)的位置是1,这样子我们就分析出规律,
接下来就看一下这串代码吧
int main()
{
int numRows;
printf("Enter the number of rows: ");
scanf("%d", &numRows);
// 打印等腰杨辉三角形
int arr[numRows][numRows]; // 声明二维数组
for (int i = 0; i < numRows; i++)
{
// 打印数字前的空格
for (int j = 0; j < numRows - i - 1; j++)
{
printf(" ");
}
// 打印该行的数字
for (int j = 0; j <= i; j++)
{
if (j == 0 || j == i)
{
arr[i][j] = 1;
}
else
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
printf("%d ", arr[i][j]);
}
printf("\n"); // 换行
}
return 0;
}
接下来我就简单分析一下这串代码,我这个是用二维数组方法;
假设numRows =4
当 i =0 进入第一个for循环 j< 4-1;打印3个空格,然后进入第二个for循环 ;if 判断 j<1此时
arr[0][0]=1;
当i=1 进入第一个for循环 j< 4-1-1;打印2个空格,然后进入第二个for循环 ;if 判断 j<2,此时
arr[1][0]=1; arr[1][1]=1;
当i=2 进入第一个for循环 j< 4-2-1;打印1个空格,然后进入第二个for循环 ;if 判断 j<3,此时
arr[2][0]=1; 当j = 1 不符合if 判断条件,进入else进行 arr[2][1]=arr[2-1][1-1]+arr[2-1][1] =》arr[2][1]=2; 当j = 2=i;就进入if判断 j=2=i;arr[2][2]=1;
当i=3 进入第一个for循环 j< 4-3-1;打印0个空格,然后进入第二个for循环 ;if 判断 j<4,此时
arr[3][0]=1; 当j = 1不符合if 判断条件,j=1进入else判断 arr[]3[1]=arr[3-1][1-1]+arr[2-1][1] =》arr[3][1]=2; j=2进入else进行 arr[3][2]=arr[3-1][2-1]+arr[3-1][2] =》arr[3][2]=2; 当j = 3=i;就进入if判断 j=3=i;arr[3][3]=1;
这样子简单讲述一下这个代码运行过程,当了不要忘记循环一次换行一次,
当然了方法不止一种,这里我在用递归方法,来看一下这串代码吧
int calculateValue(int row, int col)
{
if (col == 0 || col == row)
{
return 1;
}
else
{
return calculateValue(row - 1, col - 1) + calculateValue(row - 1, col);
}
}
int main()
{
int numRows;
printf("Enter the number of rows: ");
scanf("%d", &numRows);
// 打印杨辉三角形
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < numRows-i-1; j++)//打印空格
{
printf(" ");
}
for (int j = 0; j <= i; j++)
{
printf("%d ", calculateValue(i, j));
}
printf("\n");
}
return 0;
}
当看见这串代码是不是与上一个代码十分相似,就是把打印数字部分封装成函数,然后在把里面稍加加工一下就成了递归函数,我感觉递归总结规律出就规律和公式就非常容易写出递归了,我们接下来就对这个函数进行分析一下,就不对主函数进行分析,因为上面已经解释过,
接下来用图表写出来递归过程假设calculateValue(3, 3)
calculateValue(3, 3)
|
+-- calculateValue(2, 2)
| |
| +-- calculateValue(1, 1)
| | |
| | +-- calculateValue(0, 0)
| | | |
| | | +-- 返回 1
| | |
| | +-- 返回 1
| |
| +-- 返回 2 = 1 + 1
|
+-- calculateValue(2, 3)
|
+-- calculateValue(1, 2)
| |
| +-- calculateValue(0, 1)
| | |
| | +-- 返回 1
| |
| +-- calculateValue(0, 2)
| | |
| | +-- 返回 1
| |
| +-- 返回 2 = 1 + 1
|
+-- calculateValue(1, 3)
|
+-- calculateValue(0, 2)
| |
| +-- 返回 1
|
+-- 返回 1
这个画的可能太长了,没办法我的水平就这样子,这里只是简述递归过程,希望对你们有用吧;
这里我就不用语言简述过程,我相信聪明的你们多看一下图应该能理解这个递归过程;
这个杨辉三角形我就解释到这,我相信聪明的你们肯定有其他更好的解法欢迎你们分享一下自己解法。