1.杨辉三角(转载自百度图片)
2.杨辉三角的部分性质(转自:https://www.cnblogs.com/fusiwei/p/11364292.html)
我们从这张杨辉三角示意图上发现,杨辉三角的每行行首与每行结尾的数都为1.而且,每个数等于其左上及其右上二数的和。这样我们发现,杨辉三角左右对称。
那么我们就可以通过这些基本概念把这个杨辉三角同我们所说的组合数即二项式系数联系在一起:
通过刚才的知识铺垫,我们发现,第i行的第j个数,我们可以用Cij来表示从i个元素中选取j个元素的组合数。(注意,这里的第i行是从0计数)并且,由于对称性,我们可以发现,杨辉三角中第n行的第m个数恒等于本行的第n-m+1个数。
与二项式系数知识点进行结合,我们会发现(1+x)n展开后,各次数的系数正好对应第n行的每一项。
杨辉三角代码实现的递推公式
在很多题目中,我们常常需要用打表的形式先处理出杨辉三角矩阵,然后再以此为基础进行程序求解。那么我们打表的时候如果手存表格的话,不仅浪费考试时间,而且保证不了空间范围和正确性,这个时候需要我们使用递推的手段用程序处理出表格。
C[i][j]=C[i−1][j]+C[i−1][j−1];
3.杨辉三角的程序实现(C语言)
要点1:杨辉三角的两个腰边的数都是 1,其它位置的数都是上顶上两个数之和。
#define N 8 int main() { int a[N][N]; int i,j; for(i=0; i<N; i++){ a[i][0] = 1; a[i][i] = 1; } for(i=1; i<N; i++){ for(j=1; j<i; j++) { a[i][j]=a[i-1][j-1]+a[i-1][j] ; } } for(i=0; i<N; i++){ for(j=0; j<=i; j++) printf("%-5d", a[i][j]); printf(" "); } return 0; }
运行结果:
要点2:杨辉三角中的任何一个数都等于一个组合数,现在我们用这一公式来做。
#include <stdio.h> /* * 定义阶乘,在这里可能会想。为什么要用float,当我试第一次的时候, * 如果用int的话,那么在打印行数多了以后就会出错。 * 这是因为阶乘的数比较大,如果用int就不够用了。下同 */ float J(int i){ int j; float k=1; for(j=1;j<=i;j++) k=k*j; return(k); } float C(int i,int j){ /*定义组合数*/ float k; k=J(j)/(J(i)*J(j-i)); return(k); } void main(){ int i=0,j,k,n; /*打印杨辉三角*/ while(i<=0||i>16){ printf("请输入要打印的行数:"); scanf("%d",&i); } printf("%d行杨辉三角如下: ",i); for(j=0;j<i;j++){ for(n=0;n<=j;n++) printf("%4.0f",C(n,j)); printf(" "); } printf(" "); }
运行结果:
参考文章:
https://www.cnblogs.com/fusiwei/p/11364292.html
http://c.biancheng.net/view/495.html